PHP字符集问题

PHP字符集问题,php,encoding,utf-8,character-encoding,Php,Encoding,Utf 8,Character Encoding,我正在用PHP编写一个基本函数,它接受一个输入字符串,将一列“怪异”字符转换为URL友好的字符。编写函数不是问题,而是它如何用奇怪的字符解释字符串 例如,现在我有一个问题: $string = "år"; echo $string[0]; // Output: � echo $string[1]; // Output: � echo $string[0] . $string[1]; // Output: å echo $string[2]; // Output: r 所以基本上它把字母“å”解

我正在用PHP编写一个基本函数,它接受一个输入字符串,将一列“怪异”字符转换为URL友好的字符。编写函数不是问题,而是它如何用奇怪的字符解释字符串

例如,现在我有一个问题:

$string = "år";
echo $string[0]; // Output: �
echo $string[1]; // Output: �
echo $string[0] . $string[1]; // Output: å
echo $string[2]; // Output: r
所以基本上它把字母“å”解释为两个字符,这给我带来了问题。因为我希望能够单独查看字符串的每个字符,并在需要时替换它

我用UTF8对所有内容进行编码,我知道我的问题与UTF8将奇怪的字符视为两个字符有关,如上文所述

但我如何解决这个问题?基本上我想实现这一点:

$string = "år";
echo $string[0]; // Output: å
echo $string[1]; // Output: r

由于UTF编码并不总是每个字母1个字节,而是随着您需要更多空间而拉伸,因此非ASCII字母实际上占用了多个字节的内存。对字符串变量的类似数组的访问返回该字节,而不是字母。所以要真正得到它,你应该使用方法

echo mb_substr($string, 0,1);// Output: å
echo mb_substr($string, 1,1);// Output: r

Chekc out@Pekka i误解了问题此字符串是否来自db?@zod否它来自HTML表单。@Foad如果它解决了您的问题,请接受正确的答案不确定为什么会被否决?无论如何,就我看来这是正确的,所以+1@Pekka我同意。Bot这个和Artjom的答案为我解决了这个问题,但由于Artjom首先写了他的答案,我选择了他作为被接受的答案
$string = "år";

mb_internal_encoding('UTF-8');
echo mb_substr($string, 0, 1); // å
echo mb_substr($string, 1, 1); // r