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