将ASCII字符转换为全角日文字母

时间:2013-10-17 05:34:57

标签: php

我正在尝试将标准ASCII字母转换为其全角度日语等值字母。例如:

Game变为Game

我搜索了一个答案,我发现这个question的答案很好,我在下面引用过:

$str = "Game some other text by ヴィックサ";
$str = preg_replace_callback(
"/[\x{ff01}-\x{ff5e}]/u",
function($c) {
    // convert UTF-8 sequence to ordinal value
    $code = ((ord($c[0][0])&0xf)<<12)|((ord($c[0][1])&0x3f)<<6)|(ord($c[0][2])&0x3f);
    return chr($code-0xffe0);
},
$str);

但我想要反方向。我尝试在return statementm中将( - )符号更改为(+),但没有取得多大成功。

3 个答案:

答案 0 :(得分:0)

使用PHP的mb_convert_kana函数很简单。见http://php.net/manual/en/function.mb-convert-kana.php。您至少需要R模式将“han-kaku”字母转换为“zen-kaku”。

答案 1 :(得分:0)

“ / [\ x {ff01}-\ x {ff5e}] / u”用于检测字母是否为全角。您必须先找到一个半角字母。因此,我更改为“ / [\ x {0021}-\ x {007e}] / u”。 Unicode表在这里http://jrgraphix.net/r/Unicode/0020-007F

第二个是我认为的编码/解码问题。 您已将UTF-8序列转换为序数值(ASCII码)。该chr()函数从ASCII返回字符。 ASCII没有全角字母。 因此,您必须从Unicode转换。

我首先使用ord()获得字符的ASCII码,并添加了65248。 然后将十进制转换为十六进制并放在“ \ u”后面,并用逗号覆盖,这样我就可以使用json_decode()。

$str = "Game some other text by ヴィックサ";
$str = preg_replace_callback(
    "/[\x{0021}-\x{007e}]/u",
    function($c) {
        return json_decode('"'.('\\u'.dechex (ord($c[0])+65248)).'"');
    }, $str);

我无法使用mb_convert_kana()。我不知道为什么,但是我认为这是因为我使用的是韩文字符串,而不是日语。

我的英语不好,但希望这个解释对您有所帮助。

答案 2 :(得分:0)

有一种更简单的方法:

$str = "Game";
// Becomes "Game"
$wideStr = mb_convert_kana($str, "R");