php mb_convert_encoding函数从ASCII到latin-1不起作用

时间:2015-10-05 07:53:28

标签: php encoding

        //reencoding string from UTF-8 to Latin1
        echo mb_detect_encoding($out);
        $out = mb_convert_encoding($out, mb_detect_encoding($out),"ISO-8859-1");
        echo mb_detect_encoding($out);
        die;

我页面上打印的结果是:

ASCIIASCII

我已经检查了支持的可能编码(http://php.net/manual/fr/mbstring.supported-encodings.php)拉丁语1被称为ISO-8859-1。但没有任何改变......

--- [编辑] ---

这是我在mb_detect_encoding()之前打印$ out时得到的结果; 我的字符串是正确的。也许它可能是一个混乱的php.ini配置?我无法改变它......

EDI_DC40 0000000000027262 2 SALESORDER_CREATEFROMDAT201 SALESORDER_CREATEFROMDAT2 330SOL 96A ORDERSTDX4 LS SERVEURDPL SAPP48 LS SERVEURDPL 1 E2SALESORDER_CREATEFROMDAT2 X E2BPSDHD1000 00000000000272621 YPR 4803 330 0230 20151002 20151002Z300 7134012207 71 20151002 20151002 E2BPSDITM000 00000000000272622 1 L7820100 9 E2BPSDITM000 00000000000272623 2 L7820400 6 E2BPSDITM000 00000000000272624 3 L9188000 5 E2BPPARNR000 00000000000272625 AG0000510001 E2BPPARNR000 00000000000272626 WE0000510001 E2BPPARNR000 00000000000272627 LQ0000030590 E2BPPARNR000 00000000000272628 ZQ0000990238 E2BPSCHDL000 00000000000272629 1 9 E2BPSCHDL000 000000000002726210 2 6 E2BPSCHDL000 000000000002726211 3 5 E2BPSDTEXT000 000000000002726212 FR E2BPPAREX000 000000000002726213 BAPE_VBAK LX2 E2BPPAREX000 000000000002726214 BAPE_VBAKX X

ASCII ASCII

[EDIT2]

我仍有一些问题需要在ISO-8851-1中编码我的文件。 我之前添加了$out = utf8_decode($out);来生成我的文件:

    $strFileWrite    =  fopen($filePath, "w");
    $strWritableFile =  fwrite($strFileWrite, $out);
    fclose($strFileWrite);

当我在$ out变量的末尾添加“Ô”时,文件在latin-1中被识别,并且ô被很好地打印。当我在文件中间添加文件时,文件在utf8中被识别,字符“ô”打印得很差( )

2 个答案:

答案 0 :(得分:4)

正如here所写:

  

字符串没有实际的关联编码,它们只是字节   阵列。 mb_detect_encoding没有告诉你字符串的编码   有,它只是尝试 检测 它。这意味着它需要一些   猜测(你的第二个参数)并告诉你第一个有效的。

如果您的原始字符串是ASCII,那么它已经是有效的Latin-1,UTF-8和其他一大堆其他编码,它们都是ASCII的超集。转换它实际上不会改变任何东西。 mb_detect_encoding最好将其检测为ASCII,因为它是第一个有效匹配,并且它与其他任何内容一样有效。

如果您需要Latin-1,并且希望 确认 您的字符串在Latin-1编码中有效,请使用mb_check_encoding($str, 'ISO-8859-1')

也许在这里开始阅读以了解更多信息:What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

答案 1 :(得分:2)

首先请注意,PHP字符串没有任何特殊的“charset”属性。编码检测完全基于字符串的逐字节分析。

您的字符串仅包含ASCII方案中的字符,因此无论您选择哪种编码,它都始终与ASCII兼容(然后由于ASCII优先级较高而被检测为ASCII)。

mb_detect_encoding将字符串字节与指定为第二个参数的每个编码(默认为mb_detect_encoding)进行比较,并返回包含在字符串中找到的所有字节/字符的第一个编码。

几个例子(为了便于阅读,我缩短了你的字符串):

$order = mb_detect_order();
$encoding = mb_detect_encoding('EDI_DC40 0000000000027262', $order, true);

var_dump($order);
// array(2) { [0]=>string(5) "ASCII", [1]=> string(5) "UTF-8" }
var_dump($encoding);
// string(5) "ASCII"

现在让我们恢复订单。

$order = [0 => 'UTF-8', 1 => 'ASCII'];
$encoding = mb_detect_encoding('EDI_DC40 0000000000027262', $order, true);

var_dump($order);
// array(2) { [0]=>string(5) "UTF-8", [1]=> string(5) "ASCII" }
var_dump($encoding);
// string(5) "UTF-8"

现在让我们尝试将一些非ascii字符放入你的字符串中。在这种情况下,mb_detect_encoding将意识到这不是ASCII字符串,并将根据UTF-8进行检查。

$order = mb_detect_order();
$encoding = mb_detect_encoding('źEDI_DC40 0000000000027262', $order, true);

var_dump($order);
// array(2) { [0]=>string(5) "ASCII", [1]=> string(5) "UTF-8" }
var_dump($encoding);
// string(5) "UTF-8"

因为您的字符串仅包含与ASCII兼容的字符,所以您可以安全地显示,保存和编辑它为ASCII,如果它来自UTF-8源,则为事件。