проблема с UTF-8 Windows по сравнению с Mac - PullRequest
2 голосов
/ 23 июля 2010

ОК, у меня есть небольшой тестовый файл, который содержит коды utf-8.Вот оно (язык волоф)

Fˆndeen d‘kk la bu ay wolof aki seereer a fa nekk. DigantŽem ak
Cees jur—om-benni kilomeetar la. MbŽyum gerte ‘pp ci diiwaan bi mu

, вот как это выглядит в ванильном редакторе, но в шестнадцатеричном виде это:

xxd test.txt
0000000: 46cb 866e 6465 656e 2064 e280 986b 6b20  F..ndeen d...kk 
0000010: 6c61 2062 7520 6179 2077 6f6c 6f66 2061  la bu ay wolof a
0000020: 6b69 2073 6565 7265 6572 2061 2066 6120  ki seereer a fa 
0000030: 6e65 6b6b 2e20 4469 6761 6e74 c5bd 656d  nekk. Digant..em
0000040: 2061 6b0d 0a43 6565 7320 6a75 72e2 8094   ak..Cees jur...
0000050: 6f6d 2d62 656e 6e69 206b 696c 6f6d 6565  om-benni kilomee
0000060: 7461 7220 6c61 2e20 4d62 c5bd 7975 6d20  tar la. Mb..yum 
0000070: 6765 7274 6520 e280 9870 7020 6369 2064  gerte ...pp ci d
0000080: 6969 7761 616e 2062 6920 6d75 0d0a       iiwaan bi mu..

Второй символ [cb86]является нестандартным кодированием для a-grave [а], которое довольно часто встречается в веб-документах, хотя в «реальном» utf-8 a-grave будет c3a0.Real utf-8 прекрасно работает на Mac и под Windows.

Я работаю с поддельным utf-8, используя карту символов, в которую входит пара {ˆ à}, потому что эта небольшая вставка - то, что генерирует cb86, и все работаетнормально ВКЛ MAC для отображения текста (в текстовом виджете) следующим образом:

Fàndeen dëkk la bu ay wolof aki seereer a fa nekk. Digantéem ak
Cees juróom-benni kilomeetar la. Mbéyum gerte ëpp ci diiwaan bi mu

На ПК - при использовании того же файла (общего доступа) первые три прочитанных символа составляют 46 cb 20 (без использования fconfigure).Я пробежал ВСЕ возможные кодировки и никогда не смог заставить работать одну и ту же карту.[Есть двадцать, которые позволят 46 cb 86]

Извините, что это так долго, но если у кого-то есть подсказка, я хотел бы услышать это.

Тел Монахи

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Я вообще не знаю волоф.Однако я уверен, что проблема в том, что у вас есть файл в смешанной кодировке с нестандартными кодовыми точками (вместо стандартного Unicode) и затем преобразованием в байты с использованием UTF-8 схема. Это грязно!

Способ справиться с этим - сначала прочитать байты в Tcl, используя канал, настроенный для использования кодировки utf-8:

set f [open $filename]
fconfigure $f -encoding utf-8
set contents [read $f]
close $f

Затем вам нужно применить преобразование, используя string map, которое преобразует «неправильные» символы в правильные.Например, это будет сделано (насколько я могу судить) для конкретных символов, которые вы перечислили:

set mapping {"\u02c6" "\u00e0"}
set fixed [string map $mapping $contents]
# You should now be able to do anything you want with $fixed

Однако, это может быть все неправильно!Проблема в том, что я не знаю, каким должно быть содержимое файла (на уровне символов, а не байтов).Который возвращается к моему комментарию «Я вообще не знаю волоф».

Обновление

Теперь, когда dan04 определил, что было сделано с этим плохим текстом, я могу предоставить, как декодировать,Прочитайте код, как указано выше, но теперь мы используем другой шаг отображения:

set fixed [encoding convertfrom macRoman [encoding convertto cp1252 $content]]

На предоставленном образце, который дает ожидаемый результат.

0 голосов
/ 25 июля 2010

Первоначально данные были закодированы с использованием кодировки Mac (скорее всего, для этого примера римская, но турецкая и исландская также возможны), неправильно интерпретированы как windows-1252, а затем правильно преобразованы в UTF-8.

...