Tcl utf-8 windows与Mac的问题

Tcl utf-8 windows与Mac的问题,tcl,mojibake,Tcl,Mojibake,好的,我有一个包含utf-8代码的小测试文件。在这里(语言是Wolof) 这是普通编辑器中的外观,但在十六进制中是: 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

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

这是普通编辑器中的外观,但在十六进制中是:

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[a]的一种非标准编码,它被认为是非常有用的 在web文档中保持一致,尽管在“真实”utf-8中,a-grave将是c3a0。真正的utf-8工程 在Mac电脑上和Windows下都很漂亮

我通过使用一个字符映射来处理伪utf-8,该映射包含一对{ˆa},因为 小插入符号是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)。我已经浏览了所有可能的编码 而且永远也无法让同一张地图发挥作用。[有20个将允许46 cb 86]

对不起,这么长时间了,但如果有人有线索,我很想听听


我一点也不认识沃洛夫。但是,我确信您遇到的问题是,您有一个混合编码的文件,带有非标准代码点(而不是标准Unicode),然后使用UTF-8模式转换为字节<这太乱了

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

set f [open $filename]
fconfigure $f -encoding utf-8
set contents [read $f]
close $f
然后,需要使用
字符串映射
应用转换,将“错误”字符转换为正确的字符。例如,这可以(据我所知)针对您列出的特定字符:

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]]

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

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

原始问题有标签“tcl”。这和Tcl有什么关系?谢谢大家的帮助,但是。。。这些文件最初是在PC上,而不是在Mac上。碰巧Mac电脑没有问题,但PC有问题。我使用带有-encoding utf-8的fconfigure没有帮助。我已经确定“正确”的事情发生在输出文件上,但它们不会在PC、colsole窗口或文本小部件中正确显示。我将尝试convertfrom和convertto(为什么是MacRoman?)!谢谢,但是你能给我解释一下吗?因为在我之前从未涉及过Mac电脑……这个文件听起来像是从一台旧Mac电脑上开始的,然后与Windows共享,有人在不理解(甚至不看)内容的情况下将其转换为UTF-8。转换后的文件(在新Mac上)就是您现在拥有的文件。这一切是怎么发生的,我不知道;欢迎来到数据的奇妙生活!:-)再次感谢你帮我克服了这一困难。
set fixed [encoding convertfrom macRoman [encoding convertto cp1252 $content]]