PHP UTF-8重音字符(扩展ASCII?)标识问题
我在PHP UTF-8重音字符(扩展ASCII?)标识问题,php,apache,utf-8,character-encoding,non-ascii-characters,Php,Apache,Utf 8,Character Encoding,Non Ascii Characters,我在php脚本中得到了一个包含重音字符的字符串。我的脚本文件是用UTF-8编码的,没有BOM。但我无法在不破坏单一重音字符的情况下将其隔离: 样本: <!doctype html> <html> <head> <meta charset='UTF-8'> </head> <body> <?php $myWord='Méditerranée'; // 12 characters long
php
脚本中得到了一个包含重音字符的字符串。我的脚本文件是用UTF-8
编码的,没有BOM
。但我无法在不破坏单一重音字符的情况下将其隔离:
样本:
<!doctype html>
<html>
<head>
<meta charset='UTF-8'>
</head>
<body>
<?php
$myWord='Méditerranée'; // 12 characters long
echo strlen($myWord).'<br/>'; // shows 14
echo mb_strlen($myWord).'<br/>';// shows 12
$myWord=str_split($myWord);
echo count($myWord).'<br/>'; // shows 14
foreach($myWord as $rank=>$character) {
echo $character;
} // shows 'Méditerranée'
foreach($myWord as $rank=>$character) {
echo $character.' ';
} // shows 'M * * d i t e r r a n * * e '
/* each * is a black diamond with a question mark inside */
foreach
循环按字节而不是按字符工作,因为它不适用于字符串。这意味着它将utf多字节序列作为多个字符处理,这导致多字节字符的各个部分被空格分隔。这意味着您可以将一个utf字符设置为多个spance分隔字符。其中一些很可能是“不可写入的”。基本上,您不能对UTF-8字符串执行foreach
,因为PHP不知道该字符串对每个字符使用多个字节。见链接文章。