2013-05-01 217 views
1

我需要一種方法在純Python 2.6中將字符串從標準ASCII和Unicode FULLWIDTH字符中進行轉換,反之亦然。該字符串也可能包含符號。在Python中將Unicode全寬轉換爲標準ASCII(並返回)

我試過unicodedata.normalize,但它不轉換符號,而且是單向的。在其他問題中發現的其他解決方案對我的程序來說效果並不理想(很多不會轉換符號)。

我正在嘗試爲PS2創建一個savefile讀寫器。例如我從文件中讀取字符串:

'\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\[email protected]\x82c\x82\x81\x82\x94\x82\x81' 

s-jis -encoded,我.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' 

(有LifeSystem之間沒有任何東西)

請注意,我選擇了這個保存,因爲它包含了兩個最經常性的符號,-和空間。

此外,我必須能夠以相同的方式重新編碼它,因爲用戶可能會重命名保存,所以我必須從輸入對話框中取出字符串並再次將其寫入文件。

+0

簡單的「轉換」是通過字符串數組掃描並刪除所有其他字節(總是0xFF的正弦這是標準的ASCII) – Floris 2013-05-01 11:48:40

+0

你需要創建我想你自己的ASCII碼到全角碼的映射。 Unicode規範化數據庫確實爲您提供了我所看到的wide-to-ascii映射,但反之亦然。這不是Python限制。 – 2013-05-01 11:48:50

+1

@弗洛里斯:不,那是不正確的映射。 'U + FF48'是*小寫*'H',所以ASCII 0x68。 – 2013-05-01 11:49:36

回答

4

我會用unicode.translate()來映射兩組之間;字符映射一個到一個:

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' 
+0

不完全。那麼\ u2212? – Aya 2013-05-01 11:58:37

+0

'wide_text.translate(wide_to_ascii)''爲我返回相同的'wide_text' – 2013-05-01 12:00:50

+0

@LordSpectre:是的,我的表格代錯了,更正了。 – 2013-05-01 12:01:48