2

好的,我有一个包含 utf-8 代码的小测试文件。在这里(语言是 Wolof)

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 [à] 的非标准编码,它在 Web 文档中非常一致,尽管在“真正的”utf-8 中,a-grave 将是 c3a0。真正的 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

在 PC 上 - 使用同一个文件(共享)读入的前三个字符是 46 cb 20(不使用 fconfigure)。我已经遍历了所有可能的编码,并且永远无法使用相同的地图。[有二十个允许 46 cb 86]

对不起,这太长了,但如果有人有线索,我很想听听。

电话僧侣

4

2 回答 2

1

我根本不认识沃洛夫。但是,我确定您遇到的问题是您有一个混合编码的文件,具有非标准代码点(而不是标准 Unicode),然后使用 UTF- 转换为字节8方案。这很乱!

处理这个问题的方法是首先使用配置为使用utf-8编码的通道将字节读入 Tcl:

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

然而,这可能都是错误的!问题是我不知道文件的内容应该是什么(在字符级别,而不是字节级别)。这又回到了我的评论“我根本不认识 Wolof”。

更新

既然 dan04 已经确定了对那个糟糕的文本做了什么,我可以提供如何解码。阅读上面的代码,但现在我们使用不同的映射步骤:

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

在提供的样本上,产生预期的输出。

于 2010-07-24T20:13:35.430 回答
0

数据最初使用 Mac 编码(很可能是罗马语,但在本示例中也可以使用土耳其语和冰岛语),被误解为 windows-1252,然后正确转换为 UTF-8。

于 2010-07-24T20:40:42.900 回答