2010-05-03 10 views
11

क्या किसी ने फ़ंक्शन strtr() के multibyte संस्करण लिखा है? मुझे इसकी ज़रूरत हैmultibyte strtr() -> mb_strtr()

संपादित करें 1 (वांछित उपयोग के उदाहरण):

 
Example: 
$from = 'ľľščťžýáíŕďňäô'; // these chars are in UTF-8 
$to = 'llsctzyaiŕdnao'; 

// input - in UTF-8 
$str = 'Kŕdeľ ďatľov učí koňa žrať kôru.'; 
$str = mb_strtr($str, $from, $to); 

// output - str without diacritic 
// $str = 'Krdel datlov uci kona zrat koru.'; 
+2

आप हो सकता है आप वास्तव में क्या करने के लिए कोशिश कर रहे हैं का एक उदाहरण प्रदान कर सके (कोड नमूना?)? एक निश्चित उपयोग मामले के लिए एक विकल्प का सुझाव देना आसान होगा। – Max

+0

मेरे पास हाथ में एक सटीक उदाहरण नहीं है, लेकिन हमेशा PHP दस्तावेज़ प्रलेखन पृष्ठ पर उपयोगकर्ता टिप्पणियों को देखने के लायक है: http://us3.php.net/strtr ऐसा लगता है कि ऐसे लोग हैं जो पहले से ही एक ही समस्या थी । शायद उनमें से एक ने पहले ही समाधान पोस्ट किया था। – Max

+0

हां, मैक्स, आप सही हैं। मैं वहां एक समाधान की तलाश में था लेकिन मुझे कुछ भी नहीं मिला। – Martin

उत्तर

22

मेरा मानना ​​है कि strtr is multi-byte safe, किसी भी तरह से str_replaceके बाद से मल्टी-बाइट सुरक्षित है आप लपेट सकता है:

function mb_strtr($str, $from, $to) 
{ 
    return str_replace(mb_str_split($from), mb_str_split($to), $str); 
} 

चूंकि mb_str_split फ़ंक्शन नहीं है, इसलिए आपको अपना खुद का लिखना होगा (का उपयोग करना ?

function mb_str_split($str) { 
    return preg_split('~~u', $str, null, PREG_SPLIT_NO_EMPTY);; 

} 

हालांकि एक स्ट्रिंग आप निम्नलिखित मिल सकती है से सभी (लैटिन) accentuations दूर करने के लिए आप एक समारोह के लिए देख रहे हैं:और mb_strlen), या आप बस PHP UTF-8 कार्यान्वयन (हल्के से बदल) इस्तेमाल कर सकते हैं कार्य उपयोगी:

function Unaccent($string) 
{ 
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')); 
} 

echo Unaccent('ľľščťžýáíŕďňä'); // llsctzyairdna 
echo Unaccent('Iñtërnâtiônàlizætiøn'); // Internationalizaetion 
+0

कोई फ़ंक्शन नहीं है mb_str_split – Max

+0

@ मैक्स: वास्तव में, मुझे अभी तक मेरे उत्तर के साथ नहीं किया गया था। –

+0

यह सभी तारों के लिए सही ढंग से काम नहीं करता है। उदाहरण के लिए echo mb_strtr ("a", 'a'.unichr (769), "b"); बी प्रदर्शित करेगा, जबकि मैं उम्मीद करता हूं कि चूंकि unichr (769) मूल स्ट्रिंग में नहीं है। – BertR

1

शायद str_replace का उपयोग करना एक अच्छा समाधान है। एक वैकल्पिक:

<?php 
header('Content-Type: text/plain;charset=utf-8'); 

function my_strtr($inputStr, $from, $to, $encoding = 'UTF-8') { 
     $inputStrLength = mb_strlen($inputStr, $encoding); 

     $translated = ''; 

     for($i = 0; $i < $inputStrLength; $i++) { 
       $currentChar = mb_substr($inputStr, $i, 1, $encoding); 

       $translatedCharPos = mb_strpos($from, $currentChar, 0, $encoding); 

       if($translatedCharPos === false) { 
         $translated .= $currentChar; 
       } 
       else { 
         $translated .= mb_substr($to, $translatedCharPos, 1, $encoding); 
       } 
     } 

     return $translated; 
} 


$from = 'ľľščťžýáíŕďňä'; // these chars are in UTF-8 
$to = 'llsctzyairdna'; 

// input - in UTF-8 
$str = 'Kŕdeľ ďatľov učí koňa žrať kôru.'; 

print 'Original: '; 
print chr(10); 
print $str; 

print chr(10); 
print chr(10); 

print 'Tranlated: '; 
print chr(10); 
print my_strtr($str, $from, $to); 

मेरी मशीन पीएचपी 5.2 के प्रयोग पर प्रिंटों:

Original: 
Kŕdeľ ďatľov učí koňa žrať kôru. 

Tranlated: 
Krdel datlov uci kona zrat kôru. 
2
function mb_strtr($str,$map,$enc){ 
$out=""; 
$strLn=mb_strlen($str,$enc); 
$maxKeyLn=1; 
foreach($map as $key=>$val){ 
    $keyLn=mb_strlen($key,$enc); 
    if($keyLn>$maxKeyLn){ 
     $maxKeyLn=$keyLn; 
    } 
} 
for($offset=0; $offset<$strLn;){ 
    for($ln=$maxKeyLn; $ln>=1; $ln--){ 
     $cmp=mb_substr($str,$offset,$ln,$enc); 
     if(isset($map[$cmp])){ 
      $out.=$map[$cmp]; 
      $offset+=$ln; 
      continue 2; 
     } 
    } 
    $out.=mb_substr($str,$offset,1,$enc); 
    $offset++; 
} 
return $out; 
} 
संबंधित मुद्दे