【问题标题】:working with UTF-8 encoded text使用 UTF-8 编码的文本
【发布时间】:2013-02-04 19:23:28
【问题描述】:

我有问题。我需要从我的文本文件中找到一些 utf-8 字符并输出它们,但它不输出字母,而是输出“?”、问号...

ini_set( 'default_charset', 'UTF-8' );
$homepage = file_get_contents('t1.txt');
echo $homepage;
echo "\t";
echo "\t!!!!!!!!!!!!"; 
echo $homepage[14];

所以,这里很奇怪,如果我使用现有索引它什么也不输出,但如果我放了

echo $homepage[35];

它输出“?”, 但是我的 $homepage 字符串只有 30 个字符长,怎么了?

这很奇怪,它正确地从文件中获取字符串,并正确输出,但是当我按索引调用字符时,它不起作用..这是我的文本文件中的内容: advhasgdvgv олыолоываи 呵呵

当我调用 $homepage 时它会正确输出,但是当 $homepage[14] 时它不起作用。这是输出:

advhasgdvgv олыолоываи ouhh !!!!!!!!!!!!

【问题讨论】:

  • 会不会是因为 Unicode 字符存储在超过 1 个字节中,所以访问这样的字符只会得到第一个字节?

标签: php utf-8 utf-16


【解决方案1】:

试试mb_convert_encoding,看看能不能解决问题。

http://www.php.net/manual/en/function.mb-convert-encoding.php

string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )

$homepage = mb_convert_encoding(
    file_get_contents('t1.txt'),
    "UTF-8"
);

您还应该检查 PHP 文件和那里的文本文件的编码。

【讨论】:

  • 现在,它更奇怪了.. 它输出:advhasgdvgv олÑолоÑваи ouhh !!!!!!!!!!!!g
  • 你通常可以像往常一样使用echoprint
【解决方案2】:

我使用这种方法来处理 UTF-8:

<?php
$string = 'ئاکام';//my name
mb_internal_encoding("UTF-8");
$mystring = mb_substr($string,0,1);ئ
//without mb_internal_encoding the return was Ø
echo $mystring;
?>

我还保存了所有文件(编码为 UTF-8)

【讨论】:

    【解决方案3】:

    Unicode 字符的每个字母超过 1 个字节,因此您必须这样做才能访问它们:

    echo $homepage[30] . $homepage[31];
    > и
    

    但这是假设字符只有 2 个字节,但可能还有更多;所以更通用的解决方案是:

    function charAt($str, $pos, $encoding = "UTF-8")
    {
        return mb_substr($str, $pos, 1, $encoding);
    }
    

    【讨论】:

      【解决方案4】:

      PHP 并不真正支持字符串中的 UTF-8,这意味着访问 text[n] 将获得第 n 个字节而不是第 n 个字符。 UTF-8 字符中可能有 1-4 个字节,这意味着您根本无法使用 PHP 通过索引访问它们,因为您不知道字符从哪个索引开始。此外,您显然无法使用 text[n] 检索字符,因为它可能需要多个字节。

      根据您的需要,您可以使用 utf8_decode() 将字符串转换为 ISO 8859,或者使用一些 UTF-8 感知机制从头开始遍历字符串并提取您想要/需要的字节。

      请注意,Linux 和 Windows 版本的 PHP 可能会在某些转换(例如 mb_strtoupper())中产生不同的输出,并且并非所有正则表达式函数都支持 UTF-8。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-18
        • 2012-09-27
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        相关资源
        最近更新 更多