//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中被识别,字符“ô”打印得很差( )
答案 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源,则为事件。