2011-06-30 3 views
4

Я хочу знать, есть ли способ обнаружить символы мохибак (Неверные) по их байтовому диапазону. (Для простого примера обнаружение действительных символов ascii - это просто увидеть, меньше ли их байтовых значений 128). Учитывая старые настроенные наборы символов, такие как JIS, EUC и, конечно же, UNICODE, есть ли способ сделать это?Japanese mojibake detection

Непосредственный интерес представляет собой проект C#, но я хотел бы как можно больше найти независимое от языка/платформу решение, поэтому я мог бы использовать его в C++, Java, PHP или любом другом.

Arrigato

+0

Вы видите Arigatou неправильно :) – MGZero

+0

Да, но это всегда зависит от того, какой системы латинизации вы используете - так же, как вам» повторное использование 'u' для длинного гласного. – Mikaveli

+0

Я использовал «romagi», чтобы еще больше запутать вещи. – Jahmic

ответ

1

обнаружения 文字 化 け (кракозябры) от диапазона байтов очень трудно.

Как вы знаете, большинство японских символов состоят из нескольких байтов. В случае Shift-JIS (один из самых популярных кодировок в Японии) первый байтовый диапазон японского символа - от 0x81 до 0x9f и от 0xe0 до 0xef, а второй - другой. Кроме того, символы ASCII могут быть вставлены в текст Shift-JIS. это трудно.

В Java вы можете обнаружить недопустимые символы с java.nio.charset.CharsetDecoder.

+0

Я думаю, что вы правы, по крайней мере, трудно. Фактически, без ссылочного индикатора есть случаи, когда вы не можете определить, является ли поток байтов Unicode или нет. Но, я все еще собираюсь оставить этот вопрос открытым еще немного, чтобы узнать, какие другие ответы могут появиться. – Jahmic

-1

У меня нет времени и/или уровня приоритета, чтобы следить за этим на данный момент, но я думаю, если зная источник Unicode, используя эти charts и следуя некоторым работам here, я думаю некоторые успехи могут быть решены. Аналогично, для Shift-JIS может оказаться полезным использование этого chart.

0

Что вы пытаетесь сделать здесь, это автокодирование кодировки символов, выполненное веб-браузерами. Таким образом, вы можете использовать существующую библиотеку обнаружения кодировки символов, например, universalchardet library in Mozilla; это должно быть просто, чтобы перенести его на платформу по вашему выбору.

Например, используя Марк Пилгрим Python 3 port of the universalchardet library:

>>> chardet.detect(bytes.fromhex('83828357836f8350')) 
{'confidence': 0.99, 'encoding': 'SHIFT_JIS'} 
>>> chardet.detect(bytes.fromhex('e383a2e382b8e38390e382b1')) 
{'confidence': 0.938125, 'encoding': 'utf-8'} 

Но это не надежный 100%!

>>> chardet.detect(bytes.fromhex('916d6f6a6962616b6592')) 
{'confidence': 0.6031748712523237, 'encoding': 'ISO-8859-2'} 

(Упражнение для читателя: что кодирование было это на самом деле?)