Python和Java中相同字符串的不同字符串编码

时间:2017-01-13 00:53:27

标签: java python

我有一个文本文件,我正在从中读取行并逐个处理每一行。

我遇到了这句话:

(T)he film is never sure to make a clear point – even if it seeks to rely on an ambiguous presentation.

pointeven之间我有三个字符-

我尝试将字符打印为整数。

在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'-,则两者的结果都相同。

是否可以在不必删除特殊字符的情况下解决此问题。

3 个答案:

答案 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中的相同字符串。