3

我正在尝试将标准 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 语句中将 (-) 符号更改为 (+),但没有太大成功。

4

3 回答 3

0

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

于 2013-10-17T06:07:35.563 回答
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()。我不知道为什么,但我认为这是因为我使用的是韩语字符串,而不是日语。

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

于 2018-11-14T11:39:27.893 回答
0

有一个更简单的方法来做到这一点:

$str = "Game";
// Becomes "Game"
$wideStr = mb_convert_kana($str, "R");
于 2018-11-14T16:05:35.790 回答