Php 是什么将我的UTF-8字符串更改为ASCII?

Php 是什么将我的UTF-8字符串更改为ASCII?,php,Php,我有以下代码: $string = $this->getTextFromHTML($html); echo mb_detect_encoding($string, 'ASCII,UTF-8,ISO-8859-1'); $stringArray = mb_split('\W+', $string); $cleaned = array(); foreach($stringArray as $v) { $string = trim($v); if(!empty($string

我有以下代码:

$string = $this->getTextFromHTML($html);

echo mb_detect_encoding($string, 'ASCII,UTF-8,ISO-8859-1');

$stringArray = mb_split('\W+', $string);
$cleaned = array();
foreach($stringArray as $v) {
    $string = trim($v);
    if(!empty($string))
        array_push($cleaned, $string);
}

echo mb_detect_encoding($stringArray[752], 'ASCII,UTF-8,ISO-8859-1');
上述申报表:

// UTF-8
// ASCII

我的代码的哪一部分正在将字符串转换为
ASCII
?还是我检测到的编码不正确?

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


原始字符串可能包含一些非ASCII字符,因此ASCII不是它的有效编码,但UTF-8是。当您稍后测试原始的子字符串时,该子字符串可能只包含ASCII中有效的字符,并且由于ASCII是第一个被测试的编码,因此这是猜测的结果。任何ASCII字符串也是有效的UTF-8,因此没有实际问题或发生“转换”。

正如注释中提到的@Phylogenesis,0x7F下的ASCII字符是有效的UTF-8。除非您的数据中有a,否则文本都是有效的ASCII和UTF-8。您已经指定ASCII是UTF-8之前的一个选项,因此将返回它

例如:


请尝试
true
以严格执行。strict指定是否使用严格编码检测。默认值为FALSE。我对mb_detect_编码的两个调用都将strict设置为
true
,没有任何更改。如果文本仅使用范围
\x00
\x7f
的字符,则两种编码完全相同。无法检测其中一个,而不是另一个。元素
$stringArray[752]
包含字符串。我只是随机选取了一个字符串来检测它的编码。啊,我明白了!现在这是有道理的。我必须考虑转换成UTF8。痛苦。你不需要转换任何东西。它仍然是有效的UTF-8,同时也是有效的ASCII!唯一的问题是猜测编码根本不可能。只需执行
mb\u检查编码($str,'UTF-8')
即可;如果这是
真的
,那么您的字符串是UTF-8。我担心我的字符串的其余部分可能有其他字符编码。因为字符串是从很多地方缝合在一起的。如果您最初的
mb\u detect\u encoding
调用告诉您它是UTF-8,那么字符串中的所有内容都是UTF-8(可能性非常高)。@Abs是的,UTF-8是ASCII的严格超集。所有ASCII码也是有效的UTF-8。这是它成为流行的Unicode编码方案的主要原因。谢谢你的例子,这很有意义。
<?php

$str = "apple";
// Returns ASCII
var_dump(mb_detect_encoding($str, "ASCII, UTF-8"));

// 0xEFBBBF is the byte order mark in UTF-8
$str_with_bom = chr(0xEF) . chr(0xBB) . chr(0xBF) . "apple";
// Returns UTF-8
var_dump(mb_detect_encoding($str_with_bom, "ASCII, UTF-8"));