php mb_convert_编码函数不';t从ASCII转换为拉丁语-1

php mb_convert_编码函数不';t从ASCII转换为拉丁语-1,php,encoding,Php,Encoding,打印在我的页面上的结果是: 海鞘 我已经检查了可能支持的编码()拉丁语-1被称为ISO-8859-1。但一切都没有改变 ---[编辑]--- 这是我在mb_detect_encoding()之前打印$out时得到的结果; 我的字符串是正确的。可能是php.ini配置搞砸了?我无法改变它 EDI DC40 0000000000027262 2销售订单由DAT201创建销售订单由DAT2 330SOL 96A订单Dx4 LS SERVEEURDPL SAPP48 LS SERVEEURDPL 1 E

打印在我的页面上的结果是:

海鞘

我已经检查了可能支持的编码()拉丁语-1被称为ISO-8859-1。但一切都没有改变

---[编辑]---

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

EDI DC40 0000000000027262 2销售订单由DAT201创建销售订单由DAT2 330SOL 96A订单Dx4 LS SERVEEURDPL SAPP48 LS SERVEEURDPL 1 E2销售订单由DAT2 X E2BPSDHD1 000 0000000000027261 YPR 4803 330 0230 20151002 20151002 Z300 7134012071 20151002 20151002 E2BPSDITM000 0000000000027262 1 L7820100 9 E2BPSDITM000创建00000000000272623 2 L7820400 6 E2BPSDITM000 00000000000272624 3 L9188000 5 E2BPPARNR000 00000000000272625 AG000051001 E2BPPARNR000 00000000000272626 WE000051001 E2BPPARNR000 00000000000272627 LQ000030590 E2BPPARNR000 00000000000272628 ZQ000090238 E2BPSCHDL000 00000000000272629 19 E2BPSCHDL000 000000000002726210 2 E2BPSCHDL000000000000002726211 3 5 E2BPSDTEXT000 000000000002726212 FR E2BPPAREX000 000000000002726213 BAPE_VBAK LX2 E2BPPAREX000 000000000002726214 BAPE_VBAKX

ASCII码 ASCII码

[编辑二]

我仍然有一些问题需要将我的文件编码为ISO-8851-1。 我刚刚添加了
$out=utf8\u解码($out)生成我的文件之前:

        //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;

当我在$out变量的末尾添加“Ô”时,该文件会被识别为拉丁文-1,并且正确地打印了该文件。当我把它添加到文件的中间时,文档在UTF8中被识别,字符“O.”打印得很差(� )

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

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

mb\u detect\u encoding
将字符串字节与指定为第二个参数的每个编码(默认为
mb\u detect\u 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"
现在让我们尝试将一些非ascii字符放入字符串中。在这种情况下,mb_detect_编码将意识到这不是ascii字符串,并将根据UTF-8进行检查

$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兼容字符,所以如果它来自UTF-8源,您可以安全地将其显示、保存并编辑为ASCII事件。

如所述:

字符串没有实际的关联编码,它们只是字节 数组。
mb\u detect\u编码
不会告诉您字符串的编码方式 但是,它只是试图检测它。这意味着它需要几分钟的时间 猜测(你的第二个论点)并告诉你第一个论点是有效的

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

如果您需要Latin-1,并且希望确认您的字符串在Latin-1编码中有效,请使用


也许可以从这里开始阅读以了解更多内容:

你可以发布
$out
字符串包含的内容吗?也可以尝试使用严格的模式:
mb_-detect_-encoding($out,mb_-detect_-order(),true);
好的,我理解这件事。但是我需要制作一个用拉丁语编码的文件。所以我的问题不是“为什么mb_-encoding不工作”,而是“在php中保存文件时如何选择编码"?不,您不明白。您的文件已经是拉丁-1!只是您确认该文件没有按预期工作的方式,因为您正在尝试检测编码,根据定义,这是不可能精确的。同样,您可以检查您的文件是否是有效的拉丁-1,您无法检测编码并期望它始终与y匹配我们的期望。好吧!!现在我明白了。所以毫无疑问,工作已经完成了。很多时候,我会阅读你发给我的文件。我现在更了解编码,但我仍然有一个问题。即使我的文件已经是拉丁1,我需要它被识别为拉丁1文件,因为该文件将由其他程序导入。在应用fwrite之前,我对我的字符串进行utf8_解码($out.)。但只有当它包含特殊字符时,才会将其识别为litin-1文件…有什么想法吗?再说一遍:“检测”编码不是一件事。至少不是一件可靠的事。纯文本文件不会“声明”任何地方都可以使用什么编码。这取决于每个应用程序自己知道或了解编码。你无法让某些程序将你的文件识别为某种编码。你所能做的只是输出一个正确编码的文件,然后在另一端独立处理导入/打开。再次,说了这么多,如果你的文件只包含ASCII字符,那么对于解释它被识别为.Thanx的编码几乎是不相关的,非常有用。我想我需要阅读有关编码的内容。。。
$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"
$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"