我尝试用php解码一个字符串。它在另一台机器上用vba编码。字符串将来自数据库。但是第一次使用硬编码的String,才能找到问题所在。 Teststring是“|ÞμºÎ×hg”。使用VBA时,我会在爆炸时获得以下结果:获取Ascii值:
¦ÞµºÎ× hg <- the String
9 <- length of the String
1:¦:166 <- first Char = "¦", Ascii Code 166
2:Þ:222 <- second Char = "Þ", Ascii Code 222
3:µ:181 and so on
4:º:186
5:Î:206
6:×:215
7: :160
8:h:104
9:g:103
当尝试与PHP相同时,也许php认为这是UTF8编码或其他任何东西,并给我错误的字符:
"¦ÞµºÎ× hg" <- Input String
16 <- length 16???
b""" <- i dindn't know from where this is?!
\n
1:¦:166\n <- first Char = "¦", Ascii Code 166, correct!
2:Ã:195\n <- second Char = "Ã", Ascii Code 195, WTF?
3:ž:158\n
4:Â:194\n
5:µ:181\n
6:Â:194\n
7:º:186\n
8:Ã:195\n
9:Ž:142\n
10:Ã:195\n
11:—:151\n
"""
""
我尝试了不同的方法来获取字符串中的字符,我尝试了使用detect_encoding和iconv的不同内容,但结果始终保持不变:
$strToDecode = "¦ÞµºÎ× hg"
$lenEnc = mb_strlen($strToDecode, 'ASCII');
$r = "";
$asci = 0;
$char = "";
$rTest = "\n";
for($i=1; $i <= $lenEnc-5; $i++) {
//$r = Right($strToDecode, $lenEnc - $i );
//$r = mb_substr($strToDecode, $i, 1, "ASCII");
$r = $strToDecode[$i];
$asci = ord($r);
$rTest .= $i . ":" . $r . ":" . $asci . "\n";
$strResult .= $char;
}
dd($strToDecode, $lenEnc, $rTest, $strResult);
我能做些什么来获得真正的角色而不改变它们?
非常感谢每一个提示:)
最好的问候。
答案 0 :(得分:0)
这是因为您的字符串"¦ÞµºÎ× hg"
可能存储在PHP文件(源文件)中的多字节中,并且您正在使用ASCII
参数。
如果您刚刚从mb_ *函数中删除了ASCII
参数(因为它不是ASCII),那么您的代码将按预期运行
$strToDecode = "¦ÞµºÎ× hg";
$lenEnc = mb_strlen($strToDecode);// REMOVED 'ASCII'
//var_dump($lenEnc); // its 9 NOW
$r = "";
$vp = 0;
$asci = 0;
$gofi = 0;
$char = "";
$rTest = "\n";
$strResult = "";
for($i=0; $i < $lenEnc; $i++) {
$r = mb_substr($strToDecode, $i, 1);// REMOVED 'ASCII'
$asci = ord($r);
$rTest .= $i . ":" . $r . ":" . $asci . "\n";
$strResult .= $char;
}
var_dump($rTest);exit;
这在我的机器上输出
string(78) "
0:¦:194
1:Þ:195
2:µ:194
3:º:194
4:Î:195
5:×:195
6: :32
7:h:104
8:g:103
"
我已经做了另一项测试来验证。我将源文件编码更改为ANSI(在备份文件之后),并且旧代码与ASCII
参数一起正常工作。用你的编辑改变它,看看你自己。
答案 1 :(得分:0)
使用$ strToDecode = iconv(“UTF-8”,“WINDOWS-1252”,$ strToDecode); 我现在获得大部分80%的字符串编码。但在某些情况下我得到了 例如iconv():检测到输入字符串中的非法字符,bei¬ÛÆ¿ÄÚ|½¢〜žÖ-åÖ¬Ì߯ÊÉg[†º¤ÞÛèå«ÆÜ¢§®¢Ç¡ËÖѨ
mb_detect_encoding($ strToDecode,'auto');在展位上说它是UTF-8。 在mysql表中,数据来自于设置中的拉丁语1 - latin1_german1_ci,我无法更改此内容,因为数据库从多年来的某些文件中使用,没有这个问题。他们使用vba,我无法改变它们;)