2011-02-13 293 views

回答

45

ASCII是UTF-8的一个子集,因此,如果一个文件是ASCII那么它已经是UTF8。

+0

字,如果ASCII“伸长” ASCII,那么你可能会遇到的问题。 https://en.wikipedia.org/wiki/Extended_ASCII – Azeroth2b 2017-03-29 14:26:48

19

如果您确定您当前的编码是纯ASCII,那么您不必执行任何操作,因为ASCII已经是有效的UTF-8。

但是,如果你还是要转换,只是为了确保它的UTF-8,那么你可以使用的iconv

$string = iconv('ASCII', 'UTF-8//IGNORE', $string); 

的忽略将放弃任何无效字符,以防万一有些人没有有效的ASCII。

+0

我一直把“IGNORE”理解为自动/隐含错误。 – tchrist 2011-02-13 19:22:31

2

“ASCII是UTF-8的子集,所以...” - 所以UTF-8是集合? :)

换句话说:任何字符串code points从X00建立到0x7F部分具有ASCII和UTF-8没有区别表示(字节序列)。转换这样的字符串是毫无意义的。

+1

这里的关键短语是“从x00到x7F的代码点”。如果你的“ASCII”代码点从x10到xFF,那么你需要做更多的工作。 – Azeroth2b 2017-03-29 14:29:10

2

使用mb_convert_encoding将ASCII转换为UTF-8。更多信息here

$string = "chárêctërs"; 
print(mb_detect_encoding ($string)); 

$string = mb_convert_encoding($string, "UTF-8"); 
print(mb_detect_encoding ($string)); 
0

用iconv看起来像最好的解决办法,但我我来说,我必须注意形成这样的功能:“检测到输入字符串非法字符中”(不igonore)。 我用2个函数来处理ASCII字符串将其转换为ASCII码数组,然后连载:谨慎

public static function ToAscii($string) { 
    $strlen = strlen($string); 
    $charCode = array(); 
    for ($i = 0; $i < $strlen; $i++) { 
     $charCode[] = ord(substr($string, $i, 1)); 
    } 
    $result = json_encode($charCode); 
    return $result; 
} 

public static function fromAscii($string) { 
    $charCode = json_decode($string); 
    $result = ''; 
    foreach ($charCode as $code) { 
     $result .= chr($code); 
    }; 
    return $result; 
}