0

Pythonの場合:

>>> "\xc4\xe3".decode("gbk").encode("utf-8")
'\xe4\xbd\xa0'
>>> "\xc4\xe3".decode("gbk")
u'\u4f60'

2つの結論を得ることができます。

1. \ xc4 \ xe3 in gbk encode = \ xe4 \ xbd \ xa0 in utf-8
2. \ xc4 \ xe3 in gbk encode = \ x4f \ x60 in unicode(or say in ucs-2)

Rで:

> iconv("\xc4\xe3",from="gbk",to="utf-8",toRaw=TRUE)
[[1]]
[1] e4 bd a0
> iconv("\xc4\xe3",from="gbk",to="unicode",toRaw=TRUE)
[[1]]
[1] ff fe 60 4f

今、結論1は正しいです、それはRと同じです
結論2はパズルです、
一体何がgbk encode=??の\xc4\xe3ですか?Unicodeで。
Pythonではu'\u4f60'、Rではff fe 60 4f
は等しいですか?どれが正しいですか?それらはすべて正しいですか?

4

1 に答える 1

6

Python では、表記は Unicode コードポイントを指し、それらのコードポイントのエンコーディング\uxxxxを指しません。

UCS-2、UTF-16、UTF-8 はすべて、これらのコードポイントをファイルへの保存、ネットワーク経由での転送などに適したバイト単位でキャプチャできるエンコーディングです。

コードポイントの R 表現に\u4f60は、UTF-16バイト オーダー マーク(BOM) が含まれます。選択されたバイト オーダーを示します。0xFFFE はリトルエンディアンを意味します。UTF-16 にエンコードすると、Python にもそれが含まれます。

>>> u'\uf460'.encode('utf16')
'\xff\xfe`\xf4'

ビッグエンディアンに相当するものは 0xFEFF です。明示的に選択したため、BOM が含まれないように明示的にエンコードするutf-16beか、python でエンコードできます。utf-16le

>>> u'\uf460'.encode('utf-16be')
'\xf4`'
>>> u'\uf460'.encode('utf-16le')
'`\xf4'

Joel Spolsky Unicodeの記事と、Python Unicode HOWTOを読んで、Unicode とエンコーディングの違いを十分に理解する必要があります。

于 2012-09-08T11:31:06.960 に答える