Мне было интересно, как PCRE обнаруживает символы слова на любом языке.
Я тестировал эту строку:
"間違つ"
Файл php кодируется как UTF-8 и правильно помечен с помощью Charset = UTF-8 в теге типа контента.
<?php
$string="\xE9\x96\x93\xE9\x81\x95\xE3\x81\xA4"; //Bytestream from "間違つ"
$string=preg_replace('/\w/','\w',$string);
echo $string;
echo "<br>";
$byte="\xE9"; //I've tried with each byte separately to find word characters
if(preg_match('/\w/',$byte)){
echo "$byte is a word";
}
else{
echo "$byte is not a word";
}
?>
"\xE9" "\xE9" "\xE3"
из всех байтов являются словами.
Это дисплей:
Я знаю, почему появляются символы.
Декодер использует символ замены Unicode, кодовую точку FFFD,
как декодирование неверной последовательности UTF-8, а не прекращение обработки текста.
Существуют недопустимые последовательности, поскольку один «символ слова» заменяется заменой '\w'
и затем он сломал «байтовую безопасность», чтобы показать.
Итак, вопросы:
почему эти символы сопоставляются как слова, если они не являются допустимыми последовательностями UTF-8?
Как узнать, какие символы действительно являются символами слов во всем наборе Unicode?