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

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);

但我希望它朝相反的方向移动。我尝试在返回语句中将负号改为正号,但效果不太好。


3
没有理由关闭这个问题,提问者已经做了一些研究,只是没有正确地提出问题。 - user764357
1
@LegoStormtroopr,这可能是对的,但“我只是改变减法为加法,看看会发生什么”似乎并没有暗示有任何对底层机制的理解... - CBroe
3个回答

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()函数。我不知道为什么,但我认为这是因为我使用了韩语字符串,而不是日语。

我的英语不好,但我希望这个解释能帮到你。


1
欢迎来到SO!虽然您的答案可能是解决问题的可行代码,但如果您在其中添加了帮助OP理解他做错了什么以及您的代码如何工作的附加信息,那将更加有益。 - Johannes H.
啊,谢谢!对不起,我会添加一些解释。@ Johannes H. - 체라치에

0

0

有一种更简单的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接