2013-02-24 4 views
5

काम नहीं कर रहा है मुझे यूटीएफ -8 और mb_strtoupper के साथ समस्या है।PHP: mb_strtoupper

mb_internal_encoding('UTF-8'); 
$guesstitlestring='Le Courrier de Sáint-Hyácinthe'; 

$encoding=mb_detect_encoding($guesstitlestring); 
if ($encoding!=='UTF-8') $guesstitlestring=mb_convert_encoding($guesstitlestring,'UTF-8',$encoding); 

echo "DEBUG1 $guesstitlestring\n"; 
$guesstitlestring=mb_strtoupper($guesstitlestring); 
echo "DEBUG2 $guesstitlestring\n"; 

परिणाम:

DEBUG1 Le Courrier de Sáint-Hyácinthe 
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE 

मुझे समझ नहीं आता क्यों यह हो रहा है? मैं एन्कोडिंग के साथ सावधान रहना चाहता हूं। स्ट्रिंग को पहले यूटीएफ -8 के रूप में दिया जाता है, सत्यापित और संभवतः यूटीएफ -8 में वापस लाया जाता है। यह एक दुःस्वप्न है!

अद्यतन

तो मैं समझ गए होंगे कि यह मेरे कंसोल के माध्यम से बहस में प्रवेश करने और तर्क कंसोल से बाहर वापस आ रहा का एक संयोजन की वजह से किया गया था। तो वे रास्ते में और बाहर रास्ते पर गले लगाए गए थे। समाधान इस तरह से किसी भी तर्क में प्रवेश नहीं करना है, या इस तरह से तर्क प्राप्त करना है।

इस मुद्दे को हल करने में आपकी सहायता के लिए सभी को धन्यवाद!

+0

यह कंसोल के लिए गूँजती किया जा रहा है, लेकिन यह स्पष्ट रूप से DEBUG1 में क्योंकि हाइफ़न हैं कंसोल में प्रदर्शन करता है वहाँ। – Alasdair

+1

आपकी .php फ़ाइल का एन्कोडिंग क्या है? बीओएम के बिना इसे यूटीएफ -8 में बदलने की कोशिश करें। – Hast

+0

... mh, setlocale (LC_ALL, 'en_US.UTF-8') जोड़ने का प्रयास करें; शीर्ष – Federkun

उत्तर

5

strtoupper()/mb_strtoupper() के बजाय mb_convert_case() का उपयोग करें क्योंकि ऊपरी केस कनवर्टिंग विभिन्न एन्कोडिंग में बहुत मुश्किल है, यह भी सुनिश्चित करें कि आपकी स्ट्रिंग आईटीएफ -8 है।

$content = 'Le Courrier de Sáint-Hyácinthe'; 

mb_internal_encoding('UTF-8'); 
if(!mb_check_encoding($content, 'UTF-8') 
    OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32'))) { 

    $content = mb_convert_encoding($content, 'UTF-8'); 
} 

// LE COURRIER DE SÁINT-HYÁCINTHE 
echo mb_convert_case($content, MB_CASE_UPPER, "UTF-8"); 

कार्य उदाहरण: http://3v4l.org/enEfm#v443

भी देखें कनवर्टर के बारे में पीएचपी वेबसाइट पर मेरी टिप्पणी: http://www.php.net/manual/function.utf8-encode.php#102382

+0

पर आउटपुट में ''' कम मामले में क्यों है? – Hast

+0

@Hast मुझे यकीन नहीं है। हो सकता है कि केवल फ्रेंच वर्ण एन्कोडिंग पर ऊपरी मामला मौजूद है? – powtac

+0

मैं बस अपने कंसोल में प्रश्न से एक उदाहरण चलाता हूं और यह प्रतिबिंबित करता है: 'DEBUG2 LE COURRIER DE SINTT-HYACINTHE' – Hast

2

यह मेरे लिए काम करता है, लेकिन केवल जब php फ़ाइल स्वयं UTF रूप में सहेजा जाता -8 और जब टर्मिनल मैं यूटीएफ -8 की अपेक्षा करता हूं। मुझे लगता है कि आपके लिए क्या हो रहा है यह है कि फ़ाइल आईएसओ -885 9 -1 के रूप में सहेजी गई है और आपका टर्मिनल आईएसओ -885 9 -1 की उम्मीद कर रहा है।

पहला, mb_detect_encodingवास्तव में इस स्ट्रिंग के लिए काम नहीं करता है। यहां तक ​​कि जब PHP फ़ाइल यूटीएफ -8 नहीं है, तब भी यह इसे यूटीएफ -8 के रूप में रिपोर्ट करता है।

जब आप निचले केस स्ट्रिंग को प्रिंट करते हैं, तो यह आईएसओ -885 9 -1 अक्षरों को प्रिंट करता है और आपका टर्मिनल उन्हें ठीक दिखाता है। फिर जब आप यूटीएफ -8 का उपयोग करते हुए ऊपरी मामले में परिवर्तित होते हैं, तो यह उलझ जाता है।

मैंने इस फ़ाइल के दो संस्करण बनाए हैं। मैंने इसे अपने टेक्स्ट एडिटर का उपयोग आईएसओ -885 9 -1 में iso-8859-1.php के रूप में सहेजा। तब मैं iconv इस्तेमाल किया UTF-8 में पूरी फ़ाइल कन्वर्ट करने के लिए और utf-8.php

iconv iso-8859-1.php --from iso-8859-1 --to UTF-8 > utf-8.php 

के रूप में यह बचाया मैं एन्कोडिंग कि रिटर्न mb_detect_encoding परिणाम मुद्रित करने के लिए एक लाइन जोड़ दिया।

$ file iso-8859-1.php 
iso-8859-1.php: PHP script, ISO-8859 text 

$ php iso-8859-1.php 
ENCODING: UTF-8 
DEBUG1 Le Courrier de S�int-Hy�cinthe 
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE 

$ file utf-8.php 
utf-8.php: PHP script, UTF-8 Unicode text 

$ php utf-8.php 
ENCODING: UTF-8 
DEBUG1 Le Courrier de Sáint-Hyácinthe 
DEBUG2 LE COURRIER DE SÁINT-HYÁCINTHE 

मेरे टर्मिनल वास्तव में UTF-8 पाठ की उम्मीद है, इसलिए जब मैं ISO-8859-1 पाठ यह घायल हो जाता है प्रिंट आउट। जब फ़ाइल utf-8 के रूप में सहेजी जाती है और टर्मिनल utf-8 की अपेक्षा करता है तो सब ठीक से काम करता है।

+1

क्योंकि mb_detect_encoding काम नहीं करता है, मैं जांचता हूं कि एन्कोडेड और फिर डीकोडेड स्ट्रिंग अभी भी मेरे उत्तर में मूल स्ट्रिंग है: http://stackoverflow.com/a/15051401/22470 – powtac

+0

ठीक है। लेकिन मैं ऐसा नहीं कर सकता क्योंकि स्ट्रिंग को कंसोल पर PHP स्क्रिप्ट में तर्क के रूप में दिया जाता है। इसलिए मुझे इसे पहले से ही PHP स्क्रिप्ट के अंदर से यूटीएफ -8 में मजबूर करने का एक तरीका चाहिए। – Alasdair

+0

मेरा उत्तर देखें, मैं स्ट्रिंग को यूटीएफ -8 में परिवर्तित करता हूं इससे कोई फर्क नहीं पड़ता कि इनपुट स्ट्रिंग क्या है ... – powtac

2

वास्तव में, यहाँ क्या काम करता है बस

<?php 
mb_internal_encoding('UTF-8'); 

$x='Le Courrier de Sáint-Hyácinthe'; 
echo mb_strtoupper($x) . "\n"; 

आउटपुट

LE COURRIER DE SÁINT-HYÁCINTHE 
यहाँ यह सीधे काम करता है

है, लेकिन हो सकता है आपके मामले में आप utf8_encode जोड़ने के लिए:

$x = utf8_encode('Le Courrier de Sáint-Hyácinthe'); 

- -

एक वैकल्पिक कि एमबी बिना यहाँ काम करता है,

<?php 
echo strtoupper(str_replace('á', 'Á', 'Le Courrier de Sáint-Hyácinthe')); 
+0

यह केवल तभी काम करता है जब आपके पास उचित यूटीएफ -8 इनपुट स्ट्रिंग हो। – powtac

+0

उत्तर संपादित किया गया। –

संबंधित मुद्दे