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不知道该字符串对每个字符使用多个字节。见链接文章。