我已经看到了这个问题的多个主题,但没有一个在PHP中处理它。我必须在数据库中找到一个字符串。问题是我必须查找的字符串是日文编码的,即使它们相同也与数据库条目不匹配。
搜索字符串:
Free!
数据库中的字符串:
Free!
编辑: 两个字符串都以UTF-8编码。你可以清楚地看到它们之间的区别。是否有可能从这两个字符串中识别出相等性?
如果没有编程方法来解决问题,有没有人知道我可以用来手动转换字符串的字符数据库?
问候
BluBb_mADe
答案 0 :(得分:1)
尝试使用此功能(或类似的想法......)将全宽(“日语”)字母转换为 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全宽(“日语”)字符集,我们将其取下并扣除第二个字节0x80(十进制128个),得到相应的半宽字符(我们的正常值)英国)。
但是,使用UTF-8编码时,它有时不起作用。因此我们首先需要将其转换为GBK,为此,请使用下面的代码,
$str = iconv('utf-8', 'gbk//IGNORE', $str);
// IGNORE用于忽略UTF-8中存在的一些特殊有趣字符,但不存在于GBK中。
因此,如果我们将它们放在一起,结果就会出现。