2013-09-27 3 views
3

на http://www.gnu.org/software/libiconv/ есть как 20 типов кодирования для китайского:Как определить, какой тип китайского кодирования имеет текстовый файл?

китайский EUC-CN, HZ, GBK, CP936, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, BIG5-HKSCS: 2004, BIG5-HKSCS: 2001, BIG5-HKSCS: 1999, ISO-2022-CN, ISO-2022-CN-EXT

Так у меня есть текстовый файл, который не является UTF-8. Это ASCII. И я хочу преобразовать его в UTF-8, используя iconv(). Но для этого мне нужно знать кодировку символа источника.

Как я могу это сделать, если я не знаю китайца? :(

Я заметил, что:

$str = iconv('GB18030', 'UTF-8', $str); 
file_put_contents('file.txt', $str); 

создает файл UTF-8 кодируются, а другие кодировки я пытался (CP950, GBK и EUC-CN), полученный файл ASCII Может это означает, что iconv есть. в состоянии обнаружить, если входное кодирование является неправильным для данной строки?

+0

Взгляните на [mb_detect_encoding] (http://php.net/manual/en/function.mb-detect-encoding.php) – davidkonrad

+0

Самый надежный способ, вероятно, будет иметь решение пользователя –

+0

@david yea i узнайте об этом. но я могу использовать его только для выяснения, является ли источник UTF-8 или нет. Я знаю, что это не lol .. – thelolcat

ответ

2

Этот может работы для ваших нужд (но я действительно не могу сказать). Установка локали и utf8_decode, и используя mb_check_encoding вместо mt_detect_encoding, кажется, дает некоторый полезный выход ..

// some text from http://chinesenotes.com/chinese_text_l10n.php 
// have tried both as string and content loaded from a file 
$chinese = '譧躆 礛簼繰 剆坲姏 潧 騔鯬 跠 瘱瘵瘲 忁曨曣 蛃袚觙'; 
$chinese=utf8_decode($chinese); 

$chinese_encodings ='EUC-CN,HZ,GBK,CP936,GB18030,EUC-TW,BIG5,CP950,BIG5-HKSCS,BIG5-HKSCS:2004,BIG5-HKSCS:2001,BIG5-HKSCS:1999,ISO-2022-CN,ISO-2022-CN-EXT'; 

$encodings = explode(',',$chinese_encodings); 

//set chinese locale 
setlocale(LC_CTYPE, 'Chinese'); 

foreach($encodings as $encoding) { 
    if (@mb_check_encoding($chinese, $encoding)) { 
     echo 'The string seems to be compatible with '.$encoding.'<br>'; 
    } else { 
     echo 'Not compatible with '.$encoding.'<br>'; 
    } 
} 

выходы

The string seems to be compatible with EUC-CN 
The string seems to be compatible with HZ 
The string seems to be compatible with GBK 
The string seems to be compatible with CP936 
Not compatible with GB18030 
The string seems to be compatible with EUC-TW 
The string seems to be compatible with BIG5 
The string seems to be compatible with CP950 
Not compatible with BIG5-HKSCS 
Not compatible with BIG5-HKSCS:2004 
Not compatible with BIG5-HKSCS:2001 
Not compatible with BIG5-HKSCS:1999 
Not compatible with ISO-2022-CN 
Not compatible with ISO-2022-CN-EXT 

Это общее предположение. Теперь это, по крайней мере, похоже, признает некоторые китайские кодировки. Удалите, если это полный барахл.

2

у меня есть нулевой опыт с китайской кодировкой, и я знаю, этот вопрос помечен iconv, но если это будет сделано задание, то вы можете попробовать mb_detect_encoding обнаружить ваша кодировка; второй аргумент - список кодировок для проверки, и есть пользователь-cr afted комментарий о китайских кодировках:

Для китайских разработчиков: обратите внимание, что второй аргумент этой функции не включает «GB2312» и «GBK» и возвращаемое значение «EUC-CN», когда он определяется как строка GB2312.

так, может быть, он будет работать, если вы явно предоставите полный список китайских кодировок в качестве второго аргумента? Она могла бы работать так:

$encoding = mb_detect_encoding($chineseString, 'GB2312,GBK,(...)'); 
if($encoding) $utf8text = iconv($encoding, 'UTF-8', $str); 

вы также можете играть с третьим аргументом (strict)

+0

попробовал это, со строгим тоже, и из этого списка он возвращает EUC-CN, CP936, GB18030 ... Я не думаю, что файл может иметь несколько кодировок – thelolcat

+0

@thelolcat вы можете скопировать и вставить возврат с помощью mb_detect_encoding ? Я не знаю, какая строка кодированных разделов запятой, возвращаемая из этой функции – Ohgodwhy

+0

, она возвращает только одну, но я попытался изменить порядок ввода кодировок, и он возвращает других тоже – thelolcat

2

Что затрудняет обнаружение кодирования, является тот факт, что последовательности октетов декодируются действительными символами в нескольких кодировках, но результат имеет смысл только в правильной кодировке. То, что я делал в этих случаях, - это взять декодированный текст и перейти к automatic translation service и посмотреть, не получите ли вы разборчивый текст или беспорядок слогов.

Вы можете сделать это программно, например, путем анализа частот триграфа во входном тексте.Библиотеки, подобные this one, уже созданы для решения этой проблемы, и есть внешние программы, которые это делают, но мне еще предстоит увидеть что-либо с PHP API. Однако этот подход не является безупречным.

Смежные вопросы