Python:如何用半角字符替换全角字符?

Dar*_*Gee 10 python unicode translation

如果这是PHP,我可能会这样做:

function no_more_half_widths($string){
  $foo = array('?','?','?','?','?','?','?','?','?','??')
  $bar = array('1','2','3','4','5','6','7','8','9','10')
  return str_replace($foo, $bar, $string)
}
Run Code Online (Sandbox Code Playgroud)

我在python中尝试过.translate函数,它表明数组的大小不同.我认为这是因为各个字符都是用utf-8编码的.有什么建议?

Dan*_*wby 22

内置unicodedata模块可以做到:

>>> import unicodedata
>>> foo = u'??????????'
>>> unicodedata.normalize('NFKC', foo)
u'1234567890'
Run Code Online (Sandbox Code Playgroud)

"NFKC"代表" 标准化表格 KC [兼容性分解,然后是规范组合]",并用半宽的字符替换全宽字符,这些字符Unicode等效的.

请注意,它还可以同时对各种其他事物进行标准化,例如单独的重音符号和罗马数字符号.


小智 5

在Python3中,您可以使用以下代码段。它在所有ascii字符及其对应的全角字符之间建立了映射。最棒的是,这不需要您硬键入ascii序列,这很容易出错。

 #! /usr/bin/env python3
 # -*- coding: utf-8 -*-     

 FULL2HALF = dict((i + 0xFEE0, i) for i in range(0x21, 0x7F))
 FULL2HALF[0x3000] = 0x20

 def halfen(s):
     '''
     Convert full-width characters to ASCII counterpart
     '''
     return str(s).translate(FULL2HALF)
Run Code Online (Sandbox Code Playgroud)

同样,使用相同的逻辑,您可以将半角字符转换为全角字符,以下代码显示了窍门:

 #! /usr/bin/env python3
 # -*- coding: utf-8 -*-

 HALF2FULL = dict((i, i + 0xFEE0) for i in range(0x21, 0x7F))
 HALF2FULL[0x20] = 0x3000

 def fullen(s):
     '''
     Convert all ASCII characters to the full-width counterpart.
     '''
     return str(s).translate(HALF2FULL)
Run Code Online (Sandbox Code Playgroud)

注意:这两个代码段仅考虑ascii字符,不会转换任何日文/韩文全角字符。

为了完整起见,来自wikepedia

Range U+FF01–FF5E将ASCII 21到7E字符复制为全角形式,即CJK计算中使用的固定宽度形式。这对于在CJK环境中排版拉丁字符很有用。U+FF00不对应于全角ASCII 20(空格字符),因为该角色已经由U+3000 “表意空格”承担。

范围U+FF65–FFDC编码片假名和韩文字符的半角形式。

范围U+FFE0–FFEE包括全角和半角符号。

还有更多,python2解决方案可以参考gist / jcayzac