我有一个文本文件,我正在从中读取行并逐个处理每一行。
我遇到了这句话:
(T)he film is never sure to make a clear point – even if it seeks to rely on an ambiguous presentation.
在point
和even
之间我有三个字符,
-
和。
我尝试将字符打印为整数。
在Java中:
String input = "(T)he film is never sure to make a clear point – even if it seeks to rely on an ambiguous presentation.";
int[] ords = new int[input.length()];
for (int i = 0; i < ords.length; i++)
ords[i] = (int) input.charAt(i);
给出:
[40, 84, 41, 104, 101, 32, 102, 105, 108, 109, 32, 105, 115, 32, 110, 101, 118, 101, 114, 32, 115, 117, 114, 101, 32, 116, 111, 32, 109, 97, 107, 101, 32, 97, 32, 99, 108, 101, 97, 114, 32, 112, 111, 105, 110, 116, 32, 8211, 32, 101, 118, 101, 110, 32, 105, 102, 32, 105, 116, 32, 115, 101, 101, 107, 115, 32, 116, 111, 32, 114, 101, 108, 121, 32, 111, 110, 32, 97, 110, 32, 97, 109, 98, 105, 103, 117, 111, 117, 115, 32, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46]
在Python中:
def get_ords(string):
return map(lambda x: ord(x), string)
给出:
[40, 84, 41, 104, 101, 32, 102, 105, 108, 109, 32, 105, 115, 32, 110, 101, 118, 101, 114, 32, 115, 117, 114, 101, 32, 116, 111, 32, 109, 97, 107, 101, 32, 97, 32, 99, 108, 101, 97, 114, 32, 112, 111, 105, 110, 116, 32, 226, 128, 147, 32, 101, 118, 101, 110, 32, 105, 102, 32, 105, 116, 32, 115, 101, 101, 107, 115, 32, 116, 111, 32, 114, 101, 108, 121, 32, 111, 110, 32, 97, 110, 32, 97, 109, 98, 105, 103, 117, 111, 117, 115, 32, 112, 114, 101, 115, 101, 110, 116, 97, 116, 105, 111, 110, 46]
在java的结果中,三个字符,
-
和由
8211
表示,在python中表示为{{1}即226, 128, 147
。当我在java和python中处理它时,这种差异会导致不同的结果。
我还注意到,如果我从字符串中删除'\xe2', '\x80', '\x93'
,和
-
,则两者的结果都相同。
是否可以在不必删除特殊字符的情况下解决此问题。
答案 0 :(得分:3)
您可能不会将它用作Python中的unicode字符串(Python 2中的u
前缀)。
这可以通过以下代码来说明(使用示例的相关部分):
# -*- coding: utf-8 -*-
x = u"t – e"
y = "t – e"
def get_ords(s):
return map(lambda x: ord(x), s)
print "x: %s" % (get_ords(x),)
print "y: %s" % (get_ords(y),)
结果是:
x: [116, 32, 8211, 32, 101]
y: [116, 32, 226, 128, 147, 32, 101]
关于Unicode的Python文档应该引起关注:https://docs.python.org/2/howto/unicode.html
从文件中读取时,您可以使用codecs
,否则,您不会将文件读取为Unicode:
import codecs
with codecs.open('test.txt','r','utf-8') as f:
x = f.read()
with open('test.txt','r') as f:
y = f.read()
(这产生与上面相同的结果。)
请注意,在Java中,用于读取的编码也可能取决于file.encoding
系统属性的值。 (这取决于您阅读文件的方式,请参阅:https://docs.oracle.com/javase/tutorial/i18n/text/stream.html)
答案 1 :(得分:0)
我会确保字符串在两者中都具有相同的编码。例如,对于python,我会做类似以下的事情来将它变成utf8:
def get_ords(string):
string = string.encode('utf-8')
return map(lambda x: ord(x), string)
答案 2 :(得分:0)
虽然@Bruno给出的答案非常好,但我能够使用以下函数解决我的问题:
from unidecode import unidecode
def remove_non_ascii(text):
return unidecode(unicode(text, encoding="utf-8"))
对于我使用remove_non_ascii
的任何字符串以及Java中的相同字符串。