【问题标题】:PHP Japanese string comparison with UnicodePHP 日文字符串与 Unicode 的比较
【发布时间】:2013-07-20 14:14:08
【问题描述】:

我已经看到了多个有关此问题的主题,但没有一个在 PHP 中处理它。我必须在数据库中找到一个字符串。问题是我要查找的字符串是日文编码的,即使它们相等也不与数据库条目匹配。

搜索字符串:

Free!

数据库中的字符串:

Free!

编辑: 两个字符串都以 UTF-8 编码。您可以清楚地看到它们之间的区别。是否有可能从这两个字符串中识别相等?

如果没有编程方式来解决问题,有没有人知道我可以用来手动转换字符串的字符数据库?

问候

BluBb_MADe

【问题讨论】:

    标签: php string unicode encoding


    【解决方案1】:

    尝试使用这个函数(或类似的想法......)将 fullwidth(“日语”)字母转换为 halfwidth(这是我们的普通字母)每天见)第一。希望这可以帮助。 :)

    function makeSemiWidth($str) 
    { 
    $arr = array('0' => '0', 
                 '1' => '1', 
                 '2' => '2', 
                 '3' => '3', 
                 '4' => '4', 
                 '5' => '5',  
                 '6' => '6',  
                 '7' => '7',  
                 '8' => '8',  
                 '9' => '9',  
                 'A' => 'A',  
                 'B' => 'B',  
                 'C' => 'C',  
                 'D' => 'D',  
                 'E' => 'E', 
                 'F' => 'F',  
                 'G' => 'G',  
                 'H' => 'H',  
                 'I' => 'I',  
                 'J' => 'J',  
                 'K' => 'K',  
                 'L' => 'L',  
                 'M' => 'M',  
                 'N' => 'N',  
                 'O' => 'O', 
                 'P' => 'P',  
                 'Q' => 'Q',  
                 'R' => 'R',  
                 'S' => 'S',  
                 'T' => 'T', 
                 'U' => 'U',  
                 'V' => 'V',  
                 'W' => 'W',  
                 'X' => 'X',  
                 'Y' => 'Y', 
                 'Z' => 'Z',  
                 'a' => 'a',  
                 'b' => 'b',  
                 'c' => 'c',  
                 'd' => 'd', 
                 'e' => 'e',  
                 'f' => 'f',  
                 'g' => 'g',  
                 'h' => 'h',  
                 'i' => 'i', 
                 'j' => 'j',  
                 'k' => 'k',  
                 'l' => 'l',  
                 'm' => 'm',  
                 'n' => 'n', 
                 'o' => 'o',  
                 'p' => 'p',  
                 'q' => 'q',  
                 'r' => 'r',  
                 's' => 's',  
                 't' => 't',  
                 'u' => 'u',  
                 'v' => 'v',  
                 'w' => 'w',  
                 'x' => 'x',  
                 'y' => 'y',  
                 'z' => 'z', 
                 '(' => '(',  
                 ')' => ')',  
                 '〔' => '[',  
                 '〕' => ']',  
                 '【' => '[', 
                 '】' => ']',  
                 '〖' => '[',  
                 '〗' => ']',  
                 '“' => '[',  
                 '”' => ']', 
                 '‘' => '[',  
                 '\'' => ']',  
                 '{' => '{',  
                 '}' => '}',  
                 '《' => '<', 
                 '》' => '>', 
                 '%' => '%',  
                 '+' => '+',  
                 '—' => '-',  
                 '-' => '-',  
                 '~' => '-', 
                 ':' => ':',  
                 '。' => '.',  
                 '、' => ',',  
                 ',' => '.',  
                 '、' => '.',  
                 ';' => ',',  
                 '?' => '?',  
                 '!' => '!',  
                 '…' => '-',  
                 '‖' => '|',  
                 '”' => '"',  
                 '\'' => '`',  
                 '‘' => '`',  
                 '|' => '|',  
                 '〃' => '"','  
                 ' => ' '); 
    return strtr($str, $arr); 
    } 
    

    或者,您也可以尝试以相反的方式转换它们,此函数将能够从全角(“日语”)转换为半角(我们的英语),并从半角转换为全角。

    <?PHP
    function makeSemiWidth($str,$args2=1) { //halfwidth <-> fullwidth conversion function, set the 2nd parameter to 0 for converting halfwidth (English) to fullwidth (Japanese); set it to 1 for converting fullwidth to halfwidth
    $DBC = Array(
    '0' , '1' , '2' , '3' , '4' , 
    '5' , '6' , '7' , '8' , '9' ,
    'A' , 'B' , 'C' , 'D' , 'E' , 
    'F' , 'G' , 'H' , 'I' , 'J' ,
    'K' , 'L' , 'M' , 'N' , 'O' , 
    'P' , 'Q' , 'R' , 'S' , 'T' ,
    'U' , 'V' , 'W' , 'X' , 'Y' , 
    'Z' , 'a' , 'b' , 'c' , 'd' ,
    'e' , 'f' , 'g' , 'h' , 'i' , 
    'j' , 'k' , 'l' , 'm' , 'n' ,
    'o' , 'p' , 'q' , 'r' , 's' , 
    't' , 'u' , 'v' , 'w' , 'x' ,
    'y' , 'z' , '-' , ' '  , ':' ,
    '.' , ',' , '/' , '%' , '#' ,
    '!' , '@' , '&' , '(' , ')' ,
    '<' , '>' , '"' , ''' , '?' ,
    '[' , ']' , '{' , '}' , '\' ,
    '|' , '+' , '=' , '_' , '^' ,
    '¥' , ' ̄' , '`'
    );
    $SBC = Array( //halfwidth
    '0', '1', '2', '3', '4', 
    '5', '6', '7', '8', '9',
    'A', 'B', 'C', 'D', 'E', 
    'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O', 
    'P', 'Q', 'R', 'S', 'T',
    'U', 'V', 'W', 'X', 'Y', 
    'Z', 'a', 'b', 'c', 'd',
    'e', 'f', 'g', 'h', 'i', 
    'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 
    't', 'u', 'v', 'w', 'x',
    'y', 'z', '-', ' ', ':',
    '.', ',', '/', '%', '#',
    '!', '@', '&', '(', ')',
    '<', '>', '"', '\'','?',
    '[', ']', '{', '}', '\\',
    '|', '+', '=', '_', '^',
    '$', '~', '`'
    );
    if($args2==0)
    return str_replace($SBC,$DBC,$str);  //halfwidth -> fullwidth
    if($args2==1)
    return str_replace($DBC,$SBC,$str);  //fullwidth -> halfwidth
    else
    return false;
    }
    /*
    $str = "alskdf";
    echo $str;
    echo "<br>";
    echo makeSemiWidth($str,0);
    echo makeSemiWidth($str,1);
    */
    ?>
    

    您可能还想使用正则表达式来做到这一点,

    $str = preg_replace('/\xa3([\xa1-\xfe])/e', 'chr(ord(\1)-0x80)', $str);
    

    \xa3[\xa1-\xfe] 代表GB2312全角(“日文”)字符集,我们取它并把第2个字节减去0x80(十进制的128),得到对应的半角字符(我们正常英文)。

    但是,使用 UTF-8 编码,它有时会不起作用。因此,我们需要先将其转换为 GBK,为此,请使用以下代码,

    $str = iconv('utf-8', 'gbk//IGNORE', $str); 
    

    //IGNORE用于忽略一些在UTF-8中存在但在GBK中不存在的特殊搞笑字符。

    所以如果我们把它们放在一起,结果就会出现。

    【讨论】:

    • 嗨!我添加了另一个使用正则表达式的解决方案,您可能也想尝试一下。:) 希望对您有所帮助。
    • 正则表达式似乎没有做它应该做的,但 iconv 转换是个好主意。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2013-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2016-08-29
    • 2021-03-30
    • 2015-11-08
    相关资源
    最近更新 更多