【问题标题】:Converting ASCII characters to full-width Japanese letters将 ASCII 字符转换为全角日文字母
【发布时间】:2013-10-17 05:34:57
【问题描述】:

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

【问题讨论】:

  • 没有理由结束这个问题,提问者已经做了 一些 研究,但没有完全正确地提问。
  • @LegoStormtroopr,可能是这样,但“我只是将减法改为加法,看看会发生什么”似乎并不暗示对底层机制有任何了解......

标签: php


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有一种更简单的方法:

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

    【讨论】:

      【解决方案3】:

      "/[\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()。我不知道为什么,但我认为这是因为我使用的是韩文字符串,而不是日文。

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

      【讨论】:

      • 欢迎来到 SO!虽然您的答案可能是解决问题的有效代码,但如果您向其中添加其他信息以帮助 OP 了解他做错了什么以及您的代码是如何工作的,则会更有帮助。
      • 啊,谢谢!对不起,我会添加一些解释。 @Johannes H.
      猜你喜欢
      • 2018-11-18
      • 1970-01-01
      • 2019-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多