我有一个来自维基百科的字符串(https://en.wikipedia.org/wiki/Tyre,_Lebanon)
提尔(阿拉伯语:ain : 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]),有时被罗马化为 Sour,是黎巴嫩南部省的一个城市。'
从复制粘贴
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]),有时罗马化为 Sour,是南部的一座城市黎巴嫩省。”
最佳答案
您的系统中可能没有安装 Phoenician 字体,因此网络浏览器(如评论中提到的@lenz)改为显示字符𐤓。 Python 正确加载您的字符串。
文本中有 5 个有问题的字符:3 个腓尼基字符和 2 个阿卡德语字符:
带有腓尼基符号的问题部分的第一个字符是'Phoenician Letter Sade' ( https://unicode-table.com/en/10911/ ) -- 它在 UTF 中跨越 4 个字节- 8: F0 90 A4 91
紧随其后的是'腓尼基字母 Wau' ( https://unicode-table.com/en/10905/ ) -- 同样是 4 字节:F0 90 A4 85
<第三个字母如果'腓尼基字母 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/