这个问题不太好描述,查几个关键词都不是我要找的结果,所以麻烦各位大牛直接看例子。
对一串Unicode编码的字符,在python3中是可以直接输出的
>>> s = "\u4e94\u6761\u4e0b\u4f4d&\u4ef2\u6751\u82bd\u8863\u5b50 - fragment of tears (Moromi Original 1) [Challenge]" >>> s '五条下位&仲村芽衣子 - fragment of tears (Moromi Original 1) [Challenge]' >>> print(s) 五条下位&仲村芽衣子 - fragment of tears (Moromi Original 1) [Challenge]
但是如果一个文件,比如“1.txt”中有这样一个字符串,然后文件读入,则会出现这样的问题:
>>> file_i = open('1.txt') >>> s = file_i.read() >>> s '\\u4e94\\u6761\\u4e0b\\u4f4d&\\u4ef2\\u6751\\u82bd\\u8863\\u5b50 - fragment of tears (Moromi Original 1) [Challenge]' >>> print(s) \u4e94\u6761\u4e0b\u4f4d&\u4ef2\u6751\u82bd\u8863\u5b50 - fragment of tears (Moromi Original 1) [Challenge]
因为是以Unicode编码读入,所以 encode decode之类的方法得出的结果依然是\u格式的东西,我基本都试过了,不会解码成中文。我也查到了,可以用
file_i = codecs.open( "1.txt", "r", "unicode-escape" )来读入,可以正常解码,但是上面的问题其实是简化的,因为要处理的文档不仅是\u编码的问题,我要先读入文件,然后变成\u,再进行解码。比如有的地方可能是#UXXXX,我需要先转换为\uXXXX。
或者换个说法就是,如何将一个'\uXXXX'当做u'\uXXXX'处理?
我解释一下。文件保存通常是不能按照"unicode"这种编码方式进行保存的,必须以某种编码后形式保存,如UTF8, GBK, ASCII等。实测在linux环境下,python3会将unicode编码字符串自动转换成UTF8编码保存文件:
python3强制使用unicode编码,这个s实际存储的确实是unicode字符串。但是执行f.write()的时候,会将s.encode()的结果进行保存,于是文件编码会变成UTF-8。
引用来自“Feng_Yu”的评论
改用python3,从此免除unicode烦恼回复 @Feng_Yu : 抱歉这几天没怎么上线。确实是一个ASCII的文件,但是不管是什么编码,我的意思是文件内容就是\uXXXX甚至#uXXXX这种。或者类似的例子,如果你在记事本保存一个'1'字符,他读的时候不会读成一个1bit的1,而是'\49'这一个字符。
引用来自“Feng_Yu”的评论
我解释一下。文件保存通常是不能按照"unicode"这种编码方式进行保存的,必须以某种编码后形式保存,如UTF8, GBK, ASCII等。实测在linux环境下,python3会将unicode编码字符串自动转换成UTF8编码保存文件:
python3强制使用unicode编码,这个s实际存储的确实是unicode字符串。但是执行f.write()的时候,会将s.encode()的结果进行保存,于是文件编码会变成UTF-8。
抱歉几天没上线,感谢回复,貌似理解了一点。但是如果想在读取文件后进行转换该怎么处理?功利点说用啥函数能解决?因为decode之类的函数也试过,貌似是不起作用的。
笨办法也是有的,碰到“\\u”就提取后面四个字符,然后转化为16进制的值,chr()输出此Unicode值对应的中文字符,然后拼接起来,但是感觉好蛋疼啊。或者换个例子,如果我在文件中存了一个字符串'0101',在执行正常的读入后,应该如何将其转换成一个4bit的十进制5的二进制表示,而不是'\48\49\48\49'?如果当成一个字符数组然后一个个减48然后移位自然是可以的。
引用来自“Feng_Yu”的评论
改用python3,从此免除unicode烦恼