您可以轻松地在ASCII字符和亚洲全角Unicode宽字符之间进行转换吗?喜欢:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~
Run Code Online (Sandbox Code Playgroud)
至
?????????????????????????????????????????????????????????????????????????????????????\\???‘????
Run Code Online (Sandbox Code Playgroud)
这些"宽"字符命名为FULLWIDTH LATIN LETTER:http://www.unicodemap.org/range/87/Halfwidth%20and%20Fullwidth%20Forms/
它们的范围是0xFF00 - -0xFFEF.您可以创建查找表或只是将0xFEE0添加到ASCII代码.
全宽ASCII替换范围从U + FF01开始,而不是U + FF00.U + FF00(奇怪地)没有定义.要获得全宽SPACE,您需要使用U + 3000 IDEOGRAPHIC SPACE.不要依赖键入看起来像你想要的东西,然后通过视觉检查字符来检查你的映射 - unicodedata.name是你的朋友.这段代码:
# coding: utf-8
from unicodedata import name as ucname
# OP
normal = u"""0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~"""
wide = u"""????????????????????????????????????????????????????????????????????????????????????\\???‘????"""
# above after editing (had = twice)
widemapOP = dict((ord(x[0]), x[1]) for x in zip(normal, wide))
# Ingacio V
normal = u' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~'
wide = u'?????????????????????????????????????????????????????????????????????????????????????\\???‘????'
widemapIV = dict((ord(x[0]), x[1]) for x in zip(normal, wide))
# JM
widemapJM = dict((i, i + 0xFF00 - 0x20) for i in xrange(0x21, 0x7F))
widemapJM[0x20] = 0x3000 # IDEOGRAPHIC SPACE
maps = {'OP': widemapOP, 'IV': widemapIV, 'JM': widemapJM}.items()
for i in xrange(0x20, 0x7F):
a = unichr(i)
na = ucname(a, '?')
for tag, widemap in maps:
w = a.translate(widemap)
nw = ucname(w, '?')
if nw != "FULLWIDTH " + na:
print "%s: %04X %s => %04X %s" % (tag, i, na, ord(w), nw)
Run Code Online (Sandbox Code Playgroud)
运行时显示你真正得到的东西:一些丢失的映射和一些特殊的映射:
JM: 0020 SPACE => 3000 IDEOGRAPHIC SPACE
IV: 0020 SPACE => 3000 IDEOGRAPHIC SPACE
OP: 0020 SPACE => 0020 SPACE
IV: 0022 QUOTATION MARK => 309B KATAKANA-HIRAGANA VOICED SOUND MARK
OP: 0022 QUOTATION MARK => 309B KATAKANA-HIRAGANA VOICED SOUND MARK
IV: 0027 APOSTROPHE => 0027 APOSTROPHE
OP: 0027 APOSTROPHE => 0027 APOSTROPHE
IV: 002C COMMA => 3001 IDEOGRAPHIC COMMA
OP: 002C COMMA => 3001 IDEOGRAPHIC COMMA
IV: 002D HYPHEN-MINUS => 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
OP: 002D HYPHEN-MINUS => 30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
IV: 002E FULL STOP => 3002 IDEOGRAPHIC FULL STOP
OP: 002E FULL STOP => 3002 IDEOGRAPHIC FULL STOP
IV: 003C LESS-THAN SIGN => 3008 LEFT ANGLE BRACKET
OP: 003C LESS-THAN SIGN => 3008 LEFT ANGLE BRACKET
IV: 003E GREATER-THAN SIGN => 3009 RIGHT ANGLE BRACKET
OP: 003E GREATER-THAN SIGN => 3009 RIGHT ANGLE BRACKET
IV: 005C REVERSE SOLIDUS => 005C REVERSE SOLIDUS
OP: 005C REVERSE SOLIDUS => 005C REVERSE SOLIDUS
IV: 0060 GRAVE ACCENT => 2018 LEFT SINGLE QUOTATION MARK
OP: 0060 GRAVE ACCENT => 2018 LEFT SINGLE QUOTATION MARK
Run Code Online (Sandbox Code Playgroud)