0

「é」が「\u00e9」になり、「Ř」が「\u0158」になるように、文字列の(ö、ä、üなど)のような非ASCII(ascii> 127)文字をエンコードするにはどうすればよいですか. 私がしたことは、文字を16進数に変換し、最初の2文字を\u00に置き換えました(UTF-16の場合)。しかし、これは機能していません...ガベージ値が表示されます。正しいアルゴリズムを教えてください。

ここに私が書いたものがありますが、正しく変換されません:

f = open ("input.txt","r")
data = f.read()
x=list(data) 
i=0

for element in x:
    if ord(element)>127:
        y=hex(ord(x[i]))
        y=y[2:]
        y='\u00'+y
        x[i]=y
    i=i+1

data=''.join(x)
t= open("output.txt","w")
t.write(data)

f.close()
t.close()
4

4 に答える 4

0

'\u00xx'文字をリテラル文字列として使用するか、適切な文字を含む Unicode 文字列を使用するかの質問からは明らかではありません。

文字を直接 Unicode に変換するには、最初に作成されたコード ページを特定し、それを で使用する必要がありますdecode。ここではコードページ 852 を推測していますŘ

>>> data = '\x82\xfc'
>>> x = data.decode('cp852')
>>> x
u'\xe9\u0158'
>>> print x
éŘ

ASCII 以外の文字をエスケープ シーケンスに置き換えた ASCII のみを含む文字列にすばやく変換するには、unicode-escapeコーディングを使用します。

>>> y = x.encode('unicode-escape')
>>> y
'\\xe9\\u0158'
>>> print y
\xe9\u0158

Windows 1250 コード ページにも含まれていますが、Ř値が異なります。そこでも同じテクニックが使えます。

>>> data2 = '\xe9\xd8'
>>> data2.decode('windows-1250')
u'\xe9\u0158'
于 2013-03-07T18:55:23.770 に答える
0

ファイルをバイナリモードで開く

with open(filename,"rb") as f:
     print f.read()

それでもうまくいかない場合は、組み込みのコーデックを試してください

import codecs

with codecs.open(filename,"rb",encoding="utf8") as f:
     print f.read()
于 2013-03-07T16:36:22.297 に答える
0

stringの組み込みencodeメソッドを使用します。

# A string with a single, non-ascii character.
s = '\u00e9'

# UTF-16 encoding beginning with a byte-order-mark to identify its endianness.
s.encode('utf-16')      # b'\xff\xfe\xe9\x00'

# UTF-16 big-endian, no byte-order-mark.
s.encode('utf-16-be')   # b'\x00\xe9'

# UTF-16 little-endian, no byte-order-mark.
s.encode('utf-16-le')   # b'\xe9\x00'
于 2013-03-07T16:46:00.900 に答える
0

@TokenMacGuyは、削除した古い質問に対するこの回答を投稿しました。十分な評判を持つユーザーは削除された質問を引き続き見ることができるため、ここにコピーして貼り付けます。


Unicode から、ASCII 以外のコードポイントが「エスケープ」されている ASCII 表現に変換しようとしていますか? もしそうなら、どうですか:

>>> sample = u'some stuff: éŘ'
>>> ''.join(c if 0 < ord(c) <= 127 else '\\u{:04x}'.format(ord(c)) for c in sample)
u'some stuff: \\u00e9\\u0158'
>>> print ''.join(c if 0 < ord(c) <= 127 else '\\u{:04x}'.format(ord(c)) for c in sample)
some stuff: \u00e9\u0158

ところで、このアルゴリズムはutf-16ではありません。それを呼ばないでください;、それは ASCII です! UTF-16 は次のようになります。

>>> sample.encode('utf-16')
'\xff\xfes\x00o\x00m\x00e\x00 \x00s\x00t\x00u\x00f\x00f\x00:\x00 \x00\xe9\x00X\x01'

注: 指定しないため、この例は python3 ではなく python2.7 にあります。それが必要な場合は、質問に追加してください


それがあなたを助けるかどうかはわかりません。または、@TokenMacGuy自身がこの回答を編集して、より役立つようにするかもしれません。

于 2013-03-07T16:53:33.683 に答える