2010-09-15 12 views
5

में चरित्र को कनवर्ट करने में समस्याएं आईएसओ -885 9 -1 डेटाबेस सामग्री को यूटीएफ -8 में परिवर्तित करने के लिए PHP का उपयोग करने में कुछ समस्याएं हैं। मैं परीक्षण के लिए निम्न कोड चला रहा हूँ:PHP: आईएसओ -885 9 -1 से यूटीएफ -8

// Connect to a latin1 charset database 
// and retrieve "Georgia O’Keeffe", which contains a "’" character 
$connection = mysql_connect('*****', '*****', '*****'); 
mysql_select_db('*****', $connection); 
mysql_set_charset('latin1', $connection); 
$result = mysql_query('SELECT notes FROM categories WHERE id = 16', $connection); 
$latin1Str = mysql_result($result, 0); 
$latin1Str = substr($latin1Str, strpos($latin1Str, 'Georgia'), 16); 

// Try to convert it to UTF-8 
$utf8Str = iconv('ISO-8859-1', 'UTF-8', $latin1Str); 

// Output both 
var_dump($latin1Str); 
var_dump($utf8Str); 

जब मैं Firefox के स्रोत दृश्य में इस चलाने के लिए, यकीन है कि फायरफॉक्स के एन्कोडिंग सेटिंग बनाने "पश्चिमी (ISO-8859-1)" पर सेट है, मैं इस मिल:

asd

अभी तक, बहुत अच्छा है। पहले आउटपुट में अजीब उद्धरण शामिल है और मैं इसे सही तरीके से देख सकता हूं क्योंकि यह आईएसओ -885 9 -1 में है और फ़ायरफ़ॉक्स भी है।

मैं फ़ायरफ़ॉक्स के कूट "UTF-8", यह इस तरह दिखता है सेटिंग बदलने के बाद:

asd

कहाँ बोली चली गई? iconv() को यूटीएफ -8 में परिवर्तित नहीं किया गया था?

उत्तर

14

यू + 201 9 दाएं सिंगल कोटेशन मार्क आईएसओ -885 9 -1 में एक चरित्र नहीं है। यह windows-1252 में 0x92 के रूप में एक वर्ण है। वास्तविक आईएसओ -885 9 -1 वर्ण 0x92 एक दुर्लभ रूप से उपयोग किया जाता है C1 control character जिसे "निजी उपयोग 2" कहा जाता है।

यह बहुत चारसेट लेबल ISO-8859-1 के साथ विंडोज़ -1252 पाठ डेटा mislabel लिए आम है। कई वेब ब्राउज़र और ई-मेल क्लाइंट माइम चारसेट ISO-8859-1 क्रम में विंडोज़ -1252 पात्रों के रूप में के इलाज में इस तरह के गलत लेबलिंग को समायोजित लेकिन यह मानक नहीं व्यवहार और देखभाल है इन पैदा करने से बचने के लिए लिया जाना चाहिए आईएसओ -885 9 -1 में वर्ण सामग्री लेबल।

ऐसा प्रतीत होता है कि यह यहां हो रहा है। "आईएसओ -885 9 -1" "विंडो -1252" में बदलें।

+0

वाह, मैंने वह किया और मैं UTF-8 मोड में U + 2019 देखो! लेकिन "आईएसओ -885 9 -1" से "यूटीएफ -8" तक बड़ी मात्रा में डेटा बदलने के लिए "विंडोज़ -1252" का उपयोग करना सुरक्षित है? दूसरे शब्दों में, क्या सभी आईएसओ -885 9 -1 वर्ण अभी भी सही ढंग से परिवर्तित हो जाएंगे? – mattalxndr

+1

वर्ण 0x80-0x9F सही ढंग से परिवर्तित नहीं होंगे। लेकिन ये नियंत्रण वर्ण हैं जिनका लगभग कभी उपयोग नहीं किया जाता है। – dan04

+1

@mattalexx यदि आप उस श्रेणी में वर्णों के लिए स्ट्रिंग की जांच करते हैं और कोई भी पाते हैं, तो यह एक अच्छी शर्त है कि स्ट्रिंग को विंडोज -1252 में एन्कोड किया गया है। यदि आप ** उस सीमा में किसी भी अक्षर को नहीं ढूंढते हैं, तो यह आईएसओ -885 9 -1 होने की अधिक संभावना है। –

0

यह आपकी समस्या का समाधान होगा, मान कि अपने पृष्ठ हेडर charset utf-8 है:

// Opens a connection to a MySQL server 
$connection = mysql_connect ($server, $username, $password); 
$charset = mysql_client_encoding($connection); 
$flagChange = mysql_set_charset('utf8', $connection); 
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";