यहाँ आपके प्रश्न का उत्तर देने के लिए कुछ बहुत अच्छे उत्तर और प्रयास हैं। मैं एक एन्कोडिंग मास्टर नहीं हूं, लेकिन मैं आपके डेटाबेस के माध्यम से सभी तरह से एक शुद्ध UTF-8 स्टैक करने की आपकी इच्छा को समझता हूं । मैं utf8mb4
टेबल, फ़ील्ड्स और कनेक्शन के लिए MySQL के एन्कोडिंग का उपयोग कर रहा हूं ।
मेरी स्थिति उबली हुई है "मैं बस अपने संस्थापकों, सत्यापनकर्ताओं, व्यावसायिक तर्क और यूटीएफ -8 से निपटने के लिए तैयार किए गए बयान चाहता हूं, जब एचटीएमएल फॉर्म, या ई-मेल पंजीकरण लिंक से डेटा आता है।" इसलिए, अपने सरल तरीके से, मैंने इस विचार के साथ शुरुआत की:
- एन्कोडिंग का पता लगाने का प्रयास:
$encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];
- यदि एन्कोडिंग का पता नहीं लगाया जा सकता है,
throw new RuntimeException
- यदि इनपुट है
UTF-8
, तो जारी रखें।
एल्स, अगर यह है ISO-8859-1
याASCII
ए। UTF-8 में रूपांतरण का प्रयास करें (प्रतीक्षा करें, समाप्त नहीं)
ख। परिवर्तित मान के एन्कोडिंग का पता लगाएं
सी। यदि सूचित एन्कोडिंग और परिवर्तित मूल्य दोनों हैं UTF-8
, तो जारी रखें।
घ। अन्य,throw new RuntimeException
मेरे सार वर्ग से Sanitizer
private function isUTF8($encoding, $value)
{
return (($encoding === 'UTF-8') && (utf8_encode(utf8_decode($value)) === $value));
}
private function utf8tify(&$value)
{
$encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];
mb_internal_encoding('UTF-8');
mb_substitute_character(0xfffd); //REPLACEMENT CHARACTER
mb_detect_order($encodings);
$stringEncoding = mb_detect_encoding($value, $encodings, true);
if (!$stringEncoding) {
$value = null;
throw new \RuntimeException("Unable to identify character encoding in sanitizer.");
}
if ($this->isUTF8($stringEncoding, $value)) {
return;
} else {
$value = mb_convert_encoding($value, 'UTF-8', $stringEncoding);
$stringEncoding = mb_detect_encoding($value, $encodings, true);
if ($this->isUTF8($stringEncoding, $value)) {
return;
} else {
$value = null;
throw new \RuntimeException("Unable to convert character encoding from ISO-8859-1, or ASCII, to UTF-8 in Sanitizer.");
}
}
return;
}
कोई यह तर्क दे सकता है कि मुझे अपने अमूर्त वर्ग से एन्कोडिंग चिंताओं को अलग करना चाहिए Sanitizer
और किसी Encoder
वस्तु को ठोस बच्चे के उदाहरण में इंजेक्ट करना चाहिए Sanitizer
। हालांकि, मेरे दृष्टिकोण के साथ मुख्य समस्या यह है कि, अधिक ज्ञान के बिना, मैं केवल एन्कोडिंग प्रकारों को अस्वीकार करता हूं जो मुझे नहीं चाहिए (और मैं PHP mb_ * फ़ंक्शन पर भरोसा कर रहा हूं)। आगे के अध्ययन के बिना, मैं नहीं जान सकता कि क्या कुछ आबादी को नुकसान पहुंचाता है या नहीं (या, यदि मैं महत्वपूर्ण जानकारी पर खो रहा हूं)। इसलिए, मुझे और सीखने की जरूरत है। मुझे यह लेख मिला।
पाठ के साथ काम करने के लिए एन्कोडिंग और चरित्र सेट के बारे में प्रत्येक प्रोग्रामर को पूरी तरह से, सकारात्मक रूप से जानने की आवश्यकता है
इसके अलावा, क्या होता है जब एन्क्रिप्टेड डेटा को मेरे ईमेल पंजीकरण लिंक (उपयोग OpenSSL
या mcrypt
) में जोड़ा जाता है ? क्या यह डिकोडिंग में हस्तक्षेप कर सकता है? विंडोज -1252 के बारे में क्या? सुरक्षा निहितार्थ के बारे में क्या? के उपयोग utf8_decode()
और utf8_encode()
में Sanitizer::isUTF8
संदिग्ध हैं।
लोगों ने PHP mb_ * फ़ंक्शंस में शॉर्ट-कॉमिंग को इंगित किया है। मैंने कभी जांच का समय नहीं लिया iconv
, लेकिन अगर यह mb_ * फ़ंक्शन से बेहतर काम करता है, तो मुझे बताएं।