Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:递增特殊字符Í;_Python_Utf 8_Special Characters_Mojibake - Fatal编程技术网

Python:递增特殊字符Í;

Python:递增特殊字符Í;,python,utf-8,special-characters,mojibake,Python,Utf 8,Special Characters,Mojibake,我想从excel文件中读取一些单词并提取一些信息。 读取文件没有问题 重点是,我想增加单词的最后一个字符。对于像“A”这样的普通字符没有问题。但像“Í”这样的特殊角色是个问题 我是这样读内容的: val = val.encode('utf-8') 我把这个值放在字典里 下一步是迭代dict并获取保存的信息。info['streettype']包含以前的val。现在我将值转换为大写形式,如下所示: w2 = info['streettype'].decode('utf-8').upper().e

我想从excel文件中读取一些单词并提取一些信息。 读取文件没有问题

重点是,我想增加单词的最后一个字符。对于像“A”这样的普通字符没有问题。但像“Í”这样的特殊角色是个问题

我是这样读内容的:

val = val.encode('utf-8')
我把这个值放在字典里

下一步是迭代dict并获取保存的信息。info['streettype']包含以前的val。现在我将值转换为大写形式,如下所示:

w2 = info['streettype'].decode('utf-8').upper().encode('utf-8')
这是必要的,因为有些字符是特殊的,就像我说的(例如“é”、“ž”、“í”)。 现在我想增加单词的最后一个字符,它可以是一个特殊字符

w3 = w2.decode('utf-8')[:-1].encode('utf-8')    
lastLetter = w2.decode('utf-8')[-1].encode('utf-8')
现在,我使用以下方法增加角色:

lastLetter2 = (chr(ord(lastLetter.decode('utf-8')) + 1))
接下来我想把它保存在一个文本文件中。 我想保存原始单词和编辑过的单词。 我想我需要重新编码我的最后一封信2,但它不起作用。 当我保存我的w2和w3+lastLetter2时,我得到了奇怪的结果,因为有些是编码的,有些不是

这个词:

NÁBŘEŽÍ
我的结果是:

"NÃBŘEŽÃ", "NÃBŘEŽÎÃ"
但我想:

"NÁBŘEŽÍ", "NÁBŘEŽÎ"
(Í是ascii 205,Î是ascii 206)


有人能帮我解决这个问题吗?

停止一直将数据编码到UTF-8;将文本保持为Unicode,这样处理起来就容易多了。将编码留待最后一分钟,最好让文件对象为您编码

将文件编码为Unicode意味着在Python2中,您将使用标准内置的
open()
函数;这与Python3用于处理Unicode和文件I/O的基础结构相同

您在这里随意编码和解码,成功地创建了一个;您的文本现在是使用Windows代码页1252解码的UTF-8数据的混合体,然后再次编码为UTF8,再加上未损坏的数据:

>>> print u'NÃBŘEŽÃ'
NÃBŘEŽÃ
>>> print u'NÃBŘEŽÃ'[3:-1].encode('cp1252').decode('utf8')
ŘEŽ
请注意,第一个字符串中的最后一个字符无效;它缺少一个字节!这是因为“解码”最后一个字符的UTF-8字节的结果在一个合适的CP1252编解码器中是不可能的;我不得不使用内部修复编解码器来绕过这个问题:

>>> print u'NÃBŘEŽÃ\x8d'[3:].encode('sloppy-cp1252').decode('utf8')
ŘEŽÍ
>>> u'Í'.encode('utf8').decode('cp1252')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 1: character maps to <undefined>
>>> u'Í'.encode('utf8').decode('sloppy-cp1252')
u'\xc3\x8d'
>>> print u'Í'.encode('utf8').decode('sloppy-cp1252')
Ã
您可能想了解Python和Unicode:

  • 内德·巴奇尔德

  • 乔尔斯波尔斯基


不要对编码字符串进行操作(连接、更改字符)。对unicode(解码)字符串进行操作,并仅在完成后进行编码。Í是ascii 205,Î是ascii 206。不,他们不是。这些字符不在ASCII标准中,该标准只有128个代码点。它们是iso-8859-1(拉丁语-1)字符,在该标准中,它们确实被编码为205和206。它们也有相同的Unicode代码点。您在这里使用的是Python2还是Python3?为什么要“递增”字符?根据编码的不同,您将得到完全不同的结果。我不知道角色和他们的继任者之间有什么特殊的关系。@oele3110:那张表是非常错误的;它似乎使用的是Windows1252代码页,但该代码页只有256个代码点。剩下的744个字符来自何处是aynone的猜测,它们确实与Unicode对应,但在表中混合使用Windows1252是毫无价值的。有关正确的ASCII表,请参阅。
>>> lastletter = u'Î'
>>> ord(lastletter)
206
>>> unichr(ord(lastletter) + 1)
u'\xcf'
>>> print unichr(ord(lastletter) + 1)
Ï