繁体   English   中英

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

[英]php mb_convert_encoding function doesn't work from ASCII to latin-1

        //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)Latin-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 LXPEPEB

ASCII ASCII

[EDIT2]

我仍然遇到一些问题,无法将文件编码为ISO-8851-1。 我只是添加$out = utf8_decode($out); 在生成我的文件之前:

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

当我在$ out变量的末尾添加“Ô”时,该文件在latin-1中被识别,并且ô打印良好。 当我将其添加到文件的中间时,该文档在utf8中被识别,并且字符ô的打印不良()

由于写在这里

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

如果您的原始字符串是ASCII,则它也已经是有效的Latin-1,UTF-8以及与此相关的其他所有编码,它们都是ASCII的超集。 转换它实际上不会改变任何东西。 mb_detect_encoding最好将其检测为ASCII,因为它是第一个有效匹配项,并且与其他任何内容一样,它也是有效的答案。

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

也许从这里开始阅读以了解更多信息: 每个程序员绝对肯定要了解有关文本的编码和字符集的知识

首先请注意,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源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM