php:来自String的字符没有转换

时间:2017-12-09 09:45:57

标签: php character-encoding

我尝试用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);

我能做些什么来获得真正的角色而不改变它们?

非常感谢每一个提示:)

最好的问候。

2 个答案:

答案 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,我无法改变它们;)