Home  >  Article  >  Backend Development  >  转码的问题

转码的问题

WBOY
WBOYOriginal
2016-06-23 14:21:351106browse

mb_convert_encoding(addslashes($u[16]), 'UTF-8','ISO-8859-15,shift-jis,eucjp-win,sjis-win,ISO-8859-1,UTF-8')


这个转码只有第一个有效,比如第一个是ISO-8859-15,西欧编码就能转换过来,但日文编码就转不过来
第一个是eucjp-win,sjis-win 这些日文编码能转过来,西欧编码又转不地来。

请问这种情况怎么处理啊???


回复讨论(解决方案)

你给的字符集列表的内码有交集,不能唯一识别
为此 mb_string 开发者提供了一个 mb_check_encoding 函数,供你逐个判断

不要以为mb模块那么智能
如果没有语义分析,我觉得电脑是分不出 iso-8859-1 还是 shift-jis 的

我是知道原因了,是每段字符等于都包含了日文和西欧编码,所以第一个编码都是有效的

各位大大,像我这种情况怎么解决

以下是欧洲的
urbanizaci? camino de vi?les calle rio aragon n9 pinseque

以下是日文的
"???????? iPhone5/4S/4? ?? ?? ?????????? ?????? ??????? "

主要是西欧的里面有乱码就会被判断为日文,如果一个字符一个字符判断那不是要花很长时间去处理??

如果我说
urbanizaci? camino de vi?les calle rio aragon n9 pinseque
是GBK编码你能接受这个说法么?

$s = "???????? iPhone5/4S/4? ?? ?? ?????????? ?????? ??????? ";echo mb_detect_encoding($s, "ASCII,JIS,UTF-8,EUC-JP,SJIS");echo mb_convert_encoding($s, 'utf-8', 'SJIS'), PHP_EOL;$d = explode(',', 'shift-jis,eucjp-win,sjis-win,utf-8,jis,sjis,euc-jp,gbk');foreach($d as $t)  var_dump($t, mb_check_encoding($s, $t));
SJISセカンドショップ iPhone5/4S/4用 修理 分解 工具 星型ドライバ? スクレイパ? ネジ台座セット 
string(9) "shift-jis"
bool(true)
string(9) "eucjp-win"
bool(false)
string(8) "sjis-win"
bool(true)
string(5) "utf-8"
bool(false)
string(3) "jis"
bool(false)
string(4) "sjis"
bool(true)
string(6) "euc-jp"
bool(false)
string(3) "gbk"
bool(true)

我来搅局一下,哈哈

<?php$s = "urbanizaci? camino de vi?les calle rio aragon n9 pinseque";echo mb_detect_encoding($s, "ASCII,JIS,UTF-8,EUC-JP,SJIS,EUC-KR,ISO-8859-1");echo mb_convert_encoding($s, 'utf-8', 'ISO-8859-1'), PHP_EOL; $d = explode(',', 'shift-jis,eucjp-win,sjis-win,utf-8,jis,sjis,euc-jp,gbk,euc-kr,iso-8859-1');foreach($d as $t)  var_dump($t, mb_check_encoding($s, $t));?>

ISO-8859-1urbanización camino de viñales calle rio aragon n9 pinsequeue
string(9) "shift-jis"
bool(false)
string(9) "eucjp-win"
bool(false)
string(8) "sjis-win"
bool( true)
string(5) "utf-8"
bool(false)
string(3) "jis"
bool(false)
string(4) "sjis"
bool(false)
string(6) "euc-jp"
bool(false)
string(3) "gbk"
bool( true)
string(6) "euc-kr"
bool( true)
string(10) "iso-8859-1"
bool( true)

不是故意打击LZ,只是想说明一点:写程序要心思缜密,能做的事情才做,做出来就尽量不要错,毕竟用的人是相信了你的

你这不是搅局,在没有 BOM 指示的情况下,要想识别一个字符串的字符集是极其困难的
只在当字符串含有个字符集的差集时,才可能做唯一识别。而且字符串要足够的长

楼上两位大大,谢谢你们。

我说明一下,这些是要处理的数据,就是我们从各国网站上下载的原始数据。

通过你们的代码,我想完全靠一两种函数可能没办法很好的去识别我们所要处理的数据。

所以我现在采用变通的方法,我们有个字段是国家,根据国家来转相应的字符串。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn