Python C# – Python和C#上的Unicode字符不一样

我在处理文本文件时遇到问题。 我发现PythonC#上的字符Unicode表示是不同的。

在特定索引上使用Python 3.5.2打开文件时,unicode字符为:

 with open('file.txt', 'r', encoding = 'utf-8') as f: text = f.read() text[189] // Output: u"\U0001F464" 

在同一索引上使用C#打开文件时,此char由两个字符表示:

 string text = File.ReadAllText("file.txt", Encoding.UTF8); Console.WriteLine(((int)text[189]).ToString("X4")); // Output: "D83D" string text = File.ReadAllText("file.txt", Encoding.UTF8); Console.WriteLine(((int)text[190]).ToString("X4")); // Output: "DC64" 

所以在python上,这个char在索引189上,在c#上在189和190上。

在fileformat网站上参考这个字符:

http://www.fileformat.info/info/unicode/char/1F464/index.htm

正如你在那里看到的那样,这个字符的表示有不同的长度。 在C#/ C / C ++ / Java“\ uD83D \ uDC64”和python u“\ U0001F464”上。

文本中有问题的部分:

👤登录

有没有办法在Python 3.5和C#中使用相同的unicode表示?

编辑:

下载发生此错误的原始文件: https : //ufile.io/pr5v6

你无法解决它。 它是语言的Unicode实现中固有的。

在读取文件并解码为Unicode时,C#和Java存储内部编码为UTF-16的 Unicode字符串。 基本多语言平面 (BMP,U + 0000到U + FFFF)之外的代码点使用代理 (两个字)来表示Unicode代码点。 您可以将Unicode代码点视为两个单词的事实是漏洞抽象 。

Python 3.3+隐藏了这种抽象。 它根据需要在内部使用1字节,2字节或4字节编码来表示Unicode字符串,但仅向用户显示Unicode代码点。

Python 2(与C#和Java相同的漏洞抽象):

 Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> len(u'\U0001F464') 2 >>> u'\U0001F464'[0] u'\ud83d' >>> u'\U0001F464'[1] u'\udc64' 

Python 3.3+:

 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> len(u'\U0001F464') 1 >>> u'\U0001F464'[0] '👤' 

在内部,Python 3使用UTF-32来存储包含非BMP代码点的Unicode字符串,并使用四个字节来存储U + 1F464。