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


Converting ASCII characters to full-width Japanese letters

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

Game变得Game

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

$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 语句中的 (-) 符号更改为 (+),但没有取得多大成功。

使用 PHP 的 mb_convert_kana 函数这很简单。请参阅 http://php.net/manual/en/function.mb-convert-kana.php。您至少希望R模式将"han-kaku"字母转换为"zen-kaku"。

有一种更简单的方法可以做到这一点:

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

"/[''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()。我不知道为什么,但我认为这是因为我使用韩国弦乐,而不是日语弦乐。

我不擅长英语,但我希望这个解释对你有所帮助。