2

純粋な Python 2.6 で、文字列を標準の ASCII および Unicode FULLWIDTH 文字から、またはその逆に変換する方法が必要です。文字列には記号を含めることもできます。

unicodedata.normalize を試しましたが、シンボルを変換しません。これは一方向です。他の質問で見つかった他の解決策は、私のプログラムではうまく機能しません (多くはシンボルを変換しません)。

PS2 用のセーブファイル リーダー/ライターを作成しようとしています。たとえば、ファイルから次の文字列を読み取ります。

'\x82g\x82\x81\x82\x8c\x82\x86\x81|\x82k\x82\x89\x82\x86\x82\x85\x82r\x82\x99\x82\x93\x82\x94\x82\x85\x82\x8d\x81@\x82c\x82\x81\x82\x94\x82\x81'

エンコードされている場合はs-jis、次のようにデコードし.decode('s-jis')ます。

u'\uff28\uff41\uff4c\uff46\u2212\uff2c\uff49\uff46\uff45\uff33\uff59\uff53\uff54\uff45\uff4d\u3000\uff24\uff41\uff54\uff41'

そして私はそれを印刷します:

Half−LifeSystem Data

これは、ASCII に変換する必要がある FULLWIDTH 文字列です。これは次のようになります。

'Half-LifeSystem Data'

Life( と の間には何もありませんSystem)

この保存を選択したことに注意してください。これには、最も頻繁に使用される 2 つの記号-とスペースが含まれているためです。

また、ユーザーが保存の名前を変更する可能性があるため、以前と同じ方法で再エンコードできる必要があるため、入力ダイアログから文字列を取得してファイルに再度書き込む必要があります。

4

1 に答える 1

5

unicode.translate()2 つのセット間をマップするには a を使用します。文字は 1 対 1 でマップされます。

ascii_to_wide = dict((i, unichr(i + 0xfee0)) for i in range(0x21, 0x7f))
ascii_to_wide.update({0x20: u'\u3000', 0x2D: u'\u2212'})  # space and minus
wide_to_ascii = dict((i, unichr(i - 0xfee0)) for i in range(0xff01, 0xff5f))
wide_to_ascii.update({0x3000: u' ', 0x2212: u'-'})        # space and minus

wide_text.translate(wide_to_ascii)
ascii_text.translate(ascii_to_wide)

>>> wide_text.translate(wide_to_ascii)
u'Half-LifeSystem Data'
>>> wide_text.translate(wide_to_ascii).translate(ascii_to_wide)
u'\uff28\uff41\uff4c\uff46\u2212\uff2c\uff49\uff46\uff45\uff33\uff59\uff53\uff54\uff45\uff4d\u3000\uff24\uff41\uff54\uff41'
于 2013-05-01T11:57:01.217 に答える