[英]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.