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"));