我有一个来自维基百科(https://en.wikipedia.org/wiki/Tyre,_Lebanon)的字符串

轮胎(阿拉伯语:صور,Ṣūr;腓尼基语:𐤑𐤅𐤓,Ṣur;希伯来语:צוֹר,Tsor;泰伯利亚语希伯来语צֹר,Ṣōr;阿卡德语:𒀫𒊒,Ṣurru;希腊语:Τύρος,Týros;土耳其语:Sur;拉丁语:Tyrus,亚美尼亚(Dir)),有时被罗马字母缩写为Sour,是黎巴嫩南部省的一个城市。

从文件中加载此句子时,其长度为262。从浏览器复制并粘贴该句子时,其长度为267。

我的问题是,我在C#中有一个现有的数据管道,该管道将长度识别为266(复制和粘贴长度以上,但在C#中为默认的读取文件),但是Python3读取了C#文本输出文件并将其视为长度为262。问题是通过这两种编码系统的字符索引(例如s [10:20])将有所不同,并使端到端算法在此类情况下失败。

看起来底层编码是不同的,尽管它们对人类读者而言具有相同的外观(仅显示了不同的部分):


腓尼基语:\ xf0 \ x90 \ xa4 \ x91 \ xf0 \ x90 \ xa4 \ x85 \ xf0 \ x90 \ xa4 \ x93,\ xe1 \ xb9 \ xa2ur;
腓尼基语:\ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd,\ xe1 \ xb9 \ xa2ur;





阿卡德语:\ xf0 \ x92 \ x80 \ xab \ xf0 \ x92 \ x8a \ x92,\ xe1 \ xb9 \ xa2urru;
阿卡德语:\ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd,\ xe1 \ xb9 \ xa2urru;


Python有没有办法使用后来的长度为266的编码来读取文件?以及如何从上述utf-8字节中检测/确定正确的编码系统?

下面显示了每种情况的完整utf-8编码,以供进一步研究

从文件

b'Tyre(阿拉伯文:\ xd8 \ xb5 \ xd9 \ x88 \ xd8 \ xb1 \ xe2 \ x80 \ x8e \ xe2 \ x80 \ x8e,\ xe1 \ xb9 \ xa2 \ xc5 \ xabr;腓尼基语:\ xf0 \ x90 \ xa4 \ x91 \ xf0 \ x90 \ xa4 \ x85 \ xf0 \ x90 \ xa4 \ x93,\ xe1 \ xb9 \ xa2ur;希伯来语:\ xd7 \ xa6 \ xd7 \ x95 \ xd6 \ xb9 \ xd7 \ xa8 \ xe2 \ x80 \ x8e ,Tsor;希伯来语\ xd7 \ xa6 \ xd6 \ xb9 \ xd7 \ xa8 \ xe2 \ x80 \ x8e,\ xe1 \ xb9 \ xa2 \ xc5 \ x8dr;阿卡德语:\ xf0 \ x92 \ x80 \ xab \ xf0 \ x92 \ x8a \ x92,\ xe1 \ xb9 \ xa2urru;希腊文:\ xce \ xa4 \ xcf \ x8d \ xcf \ x81 \ xce \ xbf \ xcf \ x82,T \ xc3 \ xbdros;土耳其文:Sur;拉丁文:Tyrus,亚美尼亚文\ xd5 \ x8f \ xd5 \ xab \ xd6 \ x80 [Dir]),有时被罗马化为酸味,是黎巴嫩南部省份的一座城市。

从复制和粘贴

b'Tyre(阿拉伯语:\ xd8 \ xb5 \ xd9 \ x88 \ xd8 \ xb1 \ xe2 \ x80 \ x8e \ xe2 \ x80 \ x8e,\ xe1 \ xb9 \ xa2 \ xc5 \ xabr;腓尼基语:\ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd,\ xe1 \ xb9 \ xa2ur;希伯来语:\ xd7 \ xa6 \ xd7 \ x95 \ xd6 \ xb9 \ xd7 \ xa8 \ xe2 \ x80 \ x8e,Tsor;泰伯利亚希伯来语\ xd7 \ xa6 \ xd6 \ xb9 \ xd7 \ xa8 \ xe2 \ x80 \ x8e,\ xe1 \ xb9 \ xa2 \ xc5 \ x8dr;阿卡德语: xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd,\ xe1 \ xb9 \ xa2urru;希腊语:\ xce \ xa4 \ xcf \ x8d \ xcf \ x81 \ xce \ xbf \ xcf \ x82,T \ xc3 \ xbdros;土耳其语:Sur;拉丁语:Tyrus,亚美尼亚\ xd5 \ x8f \ xd5 \ xab \ xd6 \ x80 [Dir]),有时被罗马化为酸味,是黎巴嫩南部省的一个城市。”

最佳答案

您的系统中可能未安装腓尼基语字体,因此Web浏览器(如注释中提到的@lenz)显示字符𐤓。 Python正确加载了字符串。

文本中有5个有问题的字符:3个腓尼基语和2个阿卡德语:


带有腓尼基符号的有问题部分的第一个字符是“腓尼基字母Sade”(https://unicode-table.com/en/10911/)-它以UTF-8的形式跨越4个字节:F0 90 A4 91
紧随其后的是``腓尼基字母Wau''(https://unicode-table.com/en/10905/)-也是4个字节:F0 90 A4 85
如果'Phoenician Letter Rosh'(https://unicode-table.com/en/10913/)-的第三个字母也使用4个字节:F0 90 A4 93


(我省略了阿卡德人的。)

这些字母中的每个字母在您的编码中均被与\xef\xbf\xbd\xef\xbf\xbd相对应的��替换。

每个有问题的字母都会以两个符号代替,因此字符串的总长度增加了5个,从262个字符增加到267个字符。

关于c# - 在Python3中,字符串长度与文件中以及通过复制粘贴不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47876988/

10-09 01:33