2013-03-23 2 views
0

Кодирование конвертирования из windows-1255 в utf-8 было задано, прежде чем я узнаю, но Я по-прежнему получаю разные результаты, и я не могу его решить.Проблемы с кодировкой ... windows-1255 to utf 8?

Первой проблемой является «php iconv() или mb_convert_encoding() поддержка windows-1255 ????» При тестировании он возвращает несколько выходов (играя с // ignore & // переводим) , но его вообще не работает.

Я смотрел на mb_list_encodings() выход и не включает в себя окно-1255 ... играть и тестирование mb_detect_encoding() с Windows-1255 вход (выползли из сети) не возвращает хорошее кодировок ...

ответ

2

Вы должны быть в состоянии использовать только strtr с ассоциативным массивом символов для преобразования (данные available from MSDN, и преобразуется в массив PHP ниже). Обратите внимание, что в этом коде зарезервированные значения байта заменяются символом замены U + FFFD ("\xef\xbf\xbd").

function win1255ToUtf8($str) { 
    static $tbl = null; 
    if (!$tbl) { 
     $tbl = array_combine(range("\x80", "\xff"), array(
      "\xe2\x82\xac", "\xef\xbf\xbd", "\xe2\x80\x9a", "\xc6\x92", 
      "\xe2\x80\x9e", "\xe2\x80\xa6", "\xe2\x80\xa0", "\xe2\x80\xa1", 
      "\xcb\x86", "\xe2\x80\xb0", "\xef\xbf\xbd", "\xe2\x80\xb9", 
      "\xef\xbf\xbd", "\xef\xbf\xbd", "\xef\xbf\xbd", "\xef\xbf\xbd", 
      "\xef\xbf\xbd", "\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", 
      "\xe2\x80\x9d", "\xe2\x80\xa2", "\xe2\x80\x93", "\xe2\x80\x94", 
      "\xcb\x9c", "\xe2\x84\xa2", "\xef\xbf\xbd", "\xe2\x80\xba", 
      "\xef\xbf\xbd", "\xef\xbf\xbd", "\xef\xbf\xbd", "\xef\xbf\xbd", 
      "\xc2\xa0", "\xc2\xa1", "\xc2\xa2", "\xc2\xa3", "\xe2\x82\xaa", 
      "\xc2\xa5", "\xc2\xa6", "\xc2\xa7", "\xc2\xa8", "\xc2\xa9", 
      "\xc3\x97", "\xc2\xab", "\xc2\xac", "\xc2\xad", "\xc2\xae", 
      "\xc2\xaf", "\xc2\xb0", "\xc2\xb1", "\xc2\xb2", "\xc2\xb3", 
      "\xc2\xb4", "\xc2\xb5", "\xc2\xb6", "\xc2\xb7", "\xc2\xb8", 
      "\xc2\xb9", "\xc3\xb7", "\xc2\xbb", "\xc2\xbc", "\xc2\xbd", 
      "\xc2\xbe", "\xc2\xbf", "\xd6\xb0", "\xd6\xb1", "\xd6\xb2", 
      "\xd6\xb3", "\xd6\xb4", "\xd6\xb5", "\xd6\xb6", "\xd6\xb7", 
      "\xd6\xb8", "\xd6\xb9", "\xef\xbf\xbd", "\xd6\xbb", "\xd6\xbc", 
      "\xd6\xbd", "\xd6\xbe", "\xd6\xbf", "\xd7\x80", "\xd7\x81", 
      "\xd7\x82", "\xd7\x83", "\xd7\xb0", "\xd7\xb1", "\xd7\xb2", 
      "\xd7\xb3", "\xd7\xb4", "\xef\xbf\xbd", "\xef\xbf\xbd", 
      "\xef\xbf\xbd", "\xef\xbf\xbd", "\xef\xbf\xbd", "\xef\xbf\xbd", 
      "\xef\xbf\xbd", "\xd7\x90", "\xd7\x91", "\xd7\x92", "\xd7\x93", 
      "\xd7\x94", "\xd7\x95", "\xd7\x96", "\xd7\x97", "\xd7\x98", 
      "\xd7\x99", "\xd7\x9a", "\xd7\x9b", "\xd7\x9c", "\xd7\x9d", 
      "\xd7\x9e", "\xd7\x9f", "\xd7\xa0", "\xd7\xa1", "\xd7\xa2", 
      "\xd7\xa3", "\xd7\xa4", "\xd7\xa5", "\xd7\xa6", "\xd7\xa7", 
      "\xd7\xa8", "\xd7\xa9", "\xd7\xaa", "\xef\xbf\xbd", "\xef\xbf\xbd", 
      "\xe2\x80\x8e", "\xe2\x80\x8f", "\xef\xbf\xbd", 
     )); 
    } 
    return strtr($str, $tbl); 
} 

Я сгенерировал код выше с этим PHP скрипт:

function win1255ToUtf8($str) { 
    static $tbl = null; 
    if (!$tbl) { 
     $tbl = array_combine(range("\x80", "\xff"), array(
      <?php 

     function encodeString($str) { 
      return '"' . preg_replace('/../', '\x$0', bin2hex($str)) . '"'; 
     } 

     function codepointToUtf8($n) { 
      return mb_convert_encoding(pack('V', $n), 'UTF-8', 'UTF-32LE'); 
     } 

     $text = strip_tags(file_get_contents('http://msdn.microsoft.com/en-us/goglobal/cc305148.aspx')); 
     preg_match_all('/([0-9A-F]{2}) = U\+([0-9A-F]{4})/', $text, $matches, PREG_SET_ORDER); 

     $table = array_fill(0, 128, "\xef\xbf\xbd"); 
     foreach ($matches as $match) { 
      $input = hexdec($match[1]) - 128; 
      if ($input >= 0) { 
       $table[$input] = codepointToUtf8(hexdec($match[2])); 
      } 
     } 

     $buf = ''; 
     foreach ($table as $from => $to) { 
      $buf .= encodeString($to) . ', '; 
     } 
     echo wordwrap(substr($buf, 0, -1), 68, "\n   "), "\n"; 

?> 
     )); 
    } 
    return strtr($str, $tbl); 
} 
+0

ok поблагодарить u позволяет протестировать его ... –

+0

замечательно работает! (дважды тестируется с различным источником входных данных), можете ли вы, пожалуйста, немного объяснить это? –

1
function cp1251_to_utf8 ($txt) { 
    $in_arr = array (
     chr(208), chr(192), chr(193), chr(194), 
     chr(195), chr(196), chr(197), chr(168), 
     chr(198), chr(199), chr(200), chr(201), 
     chr(202), chr(203), chr(204), chr(205), 
     chr(206), chr(207), chr(209), chr(210), 
     chr(211), chr(212), chr(213), chr(214), 
     chr(215), chr(216), chr(217), chr(218), 
     chr(219), chr(220), chr(221), chr(222), 
     chr(223), chr(224), chr(225), chr(226), 
     chr(227), chr(228), chr(229), chr(184), 
     chr(230), chr(231), chr(232), chr(233), 
     chr(234), chr(235), chr(236), chr(237), 
     chr(238), chr(239), chr(240), chr(241), 
     chr(242), chr(243), chr(244), chr(245), 
     chr(246), chr(247), chr(248), chr(249), 
     chr(250), chr(251), chr(252), chr(253), 
     chr(254), chr(255), chr(170), chr(186), chr(434), chr(435), chr(431), chr(447) 
    ); 

    $out_arr = array (
     chr(208).chr(160), chr(208).chr(144), chr(208).chr(145), 
     chr(208).chr(146), chr(208).chr(147), chr(208).chr(148), 
     chr(208).chr(149), chr(208).chr(129), chr(208).chr(150), 
     chr(208).chr(151), chr(208).chr(152), chr(208).chr(153), 
     chr(208).chr(154), chr(208).chr(155), chr(208).chr(156), 
     chr(208).chr(157), chr(208).chr(158), chr(208).chr(159), 
     chr(208).chr(161), chr(208).chr(162), chr(208).chr(163), 
     chr(208).chr(164), chr(208).chr(165), chr(208).chr(166), 
     chr(208).chr(167), chr(208).chr(168), chr(208).chr(169), 
     chr(208).chr(170), chr(208).chr(171), chr(208).chr(172), 
     chr(208).chr(173), chr(208).chr(174), chr(208).chr(175), 
     chr(208).chr(176), chr(208).chr(177), chr(208).chr(178), 
     chr(208).chr(179), chr(208).chr(180), chr(208).chr(181), 
     chr(209).chr(145), chr(208).chr(182), chr(208).chr(183), 
     chr(208).chr(184), chr(208).chr(185), chr(208).chr(186), 
     chr(208).chr(187), chr(208).chr(188), chr(208).chr(189), 
     chr(208).chr(190), chr(208).chr(191), chr(209).chr(128), 
     chr(209).chr(129), chr(209).chr(130), chr(209).chr(131), 
     chr(209).chr(132), chr(209).chr(133), chr(209).chr(134), 
     chr(209).chr(135), chr(209).chr(136), chr(209).chr(137), 
     chr(209).chr(138), chr(209).chr(139), chr(209).chr(140), 
     chr(209).chr(141), chr(209).chr(142), chr(209).chr(143), 
     chr(209).chr(148), chr(209).chr(404), chr(209).chr(150), 
     chr(209).chr(406), chr(209).chr(151), chr(209).chr(407) 
    ); 

    //$txt = str_replace($in_arr,$out_arr,$txt); 
    $txtNew=''; 
    for($C=0;$C<StrLen($txt);$C++){ 
    If(In_Array($txt[$C],$in_arr)){ 
    $txtNew.=$out_arr[Array_Search($txt[$C],$in_arr)]; 
    }Else{ 
    $txtNew.=Utf8_Encode($txt[$C]); 
    } 


    } 
    //return $txt; 
    return $txtNew; 
} 

http://forums.adelavida.com/?Idx=php&Status=1291168368 взяты из

+0

Thank в .. но он не работает вообще - я только что тестировал и его преобразующие исходные символы (написаны на иврите) на русском языке. это, вероятно, таблица символов 1251, а не 1255, которая обрабатывает русские символы. –

+0

Да, это для кириллического кодирования. Что касается иврита, вы должны попытаться найти и заменить таблицу enc для этого. –

0

Я обнаружил, что проблема не в функции Convertion как Iconv, это в соединении с базой данных. скрипт открывает соединение с латинской кодировкой по умолчанию, а затем, когда он записывает в таблицу данные utf8, данные попадают плохо. Вы должны быть уверены, что ваше соединение UTF8 похоже на ваши данные.

С MySQL вы можете увидеть его с

print mysqli_character_set_name($link)."\n"; 

и если это не UTF8, то установить соединение кодовой

mysqli_set_charset($link, "utf8"); 

Тогда все будет нормально с iconv('ISO-8859-8','UTF-8//IGNORE',hebrev($value)); для визуального ивриту UTF8 или любой конвертации функция

2

Нашли это, и это сработало для меня

$content = iconv("CP1255", "UTF-8", $content); 

Источник: мужчина Expert Exchange