c# - Python3 中的字符串长度与文件和复制粘贴不同

标签 c# python-3.x encoding utf-8

我有一个来自维基百科的字符串(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 个阿卡德语字符:

(我省略了阿卡德语。)

在您的编码中,这些字母中的每一个都被对应于 ��\xef\xbf\xbd\xef\xbf\xbd 替换。

每个有问题的字母都以某种方式被两个 符号替换,因此字符串的总长度增加了 5,从 262 个字符增加到 267 个字符。

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

相关文章:

python - 如何在 python 中使用 dotenv 在本地 .env 文件中设置环境变量?

javascript - Java UTF-8 特殊字符转 JavaScript

postgresql - Postgres.pgadmin。如何配置编码?

c# - 如何将图像存储到 varbinary(max) 列?

c# - 计算枚举上设置的标志数

python - 尽管格式正确, Pandas 仍无法推断时间序列频率?

perl - DateTime::Format::CLDR 解析长捷克日期时出现问题

c# - 如何更改标题栏按钮 WPF C#

c# - 扩展 Akka.Net

r - knitr 不会运行 Python 命令