0

我试图了解 UTF-8、ASCII 和 Unicode 之间的区别。我已经阅读了Unicode、UTF、ASCII、ANSI 格式差异。但是我从 Python 中得到了一些错误,我不知道如何才能看到我的字符串具有哪种格式。

例如:

1# 'Klaus-Groth-Straße, Ballahausen'
2# 'Capit\xe1n\n'
3# u'Capit\xe1n\n'

我推测

  • 3# = Unicode,因为u'?
  • 1#=?
  • 2#=?

我已经尝试将字符串 #1 写入文件并为自己编写了一个小函数

def escape(html):
 html=html.replace('ö','ö')
 html=html.replace('Ö','Ö')
 html=html.replace('ä','ä')
 html=html.replace('Ä','Ä')
 html=html.replace('ü','ü')
 html=html.replace('Ü','Ü')
 html=html.replace('ß','ß')
 return html

在我将字符串写入txt文件之前,我想替换字母以在我的文本文件中获得正确的拼写(Klaus-Groth-Straße,Buchholz in der Nordheide)。

但它不起作用:/

你能告诉我我的 3 个示例属于哪种字符串 - Unicode 或 ASCII 或 UTF-8?以及如何txt使用 #1 之类的字符串将正确的拼写写入 a?

4

2 回答 2

1

你是对的,示例 #3 是一个 Unicode 字符串,因为前导u. 这可能是最容易处理的。

#1 和 #2 都是字节串。#1 完全由 ASCII 字符组成,因此您不会从中得到任何 Unicode 错误;但是它包含一个您可能希望将其转换为字符的 HTML 实体。转换 HTML 实体有多种策略,请参阅问题Decoding HTML entity with Python。结果应该是一个 Unicode 字符串。

#2 包含一个不是 ASCII 的字符,但它也不是 Unicode。如果它是一个 UTF-8 字符串,那么至少有 2 个十六进制字节,但你只有一个。这意味着它是其他一些字符编码的一部分,需要在使用它之前进行解码。Windows 1252 代码页可能是一个不错的猜测。

>>> 'Capit\xe1n\n'.decode('cp1252')
u'Capit\xe1n\n'
>>> print 'Capit\xe1n\n'.decode('cp1252')
Capitán

当您写回文件时,您需要将 Unicode 字符串转换回字节字符串。encode使用字符串上的方法执行此操作。你需要决定你希望你的文件采用什么编码。

f.write(u'Capit\xe1n\n'.encode('utf-8')

或者

f.write(u'Capit\xe1n\n'.encode('cp1252')
于 2013-04-01T20:47:04.193 回答
0

在实际上不知道出了什么问题的地方,我自己遇到了一个类似的问题,我现在已经解决了。我使用Delphi9,我的问题是从文件中读取UTF8,然后再写回来。长话短说,各种口音和/或坟墓或类似的东西在写作时从字母中消失了。编码或解码 UTF8 的工具似乎并没有完全完成这项工作,或者 Delphi 本身在后台做了一些隐藏的工作。

我最终编写了自己的 UTF8 解码器和编码器,现在一切正常。UTF8 方案实际上非常简单。一点点位移和加法,你就在解码和编码上。我用这个:“https://www.rfc-editor.org/rfc/rfc3629”作为我工作的参考。

至少它为您提供了对 UTF8 标准的完美解释。

于 2013-04-02T20:23:19.050 回答