如何在PHP中操作多语言数据?

时间:2017-07-31 17:47:36

标签: php

我有一个项目将以任何可能的语言接收数据。现在我正试图解析维基页面并获取list of languages并将其放入数据库。在解析步骤中,我发现大多数本地名称都显示为" "(空方格和东西)和其他奇怪的符号。定义的字符集是UTF-8。

我不确定这是如何运作的,也不知道在哪里进一步挖掘。我无法在网站上找到有关多语言内容的任何信息。我是否应该使用所有符号的代码来使用它们?如何使这项工作?

我需要:

  • 英语中的语言名称,本地语言和短语将添加到db;
  • 正确显示任何国家/地区的数据(编码事物);
  • 人们将能够添加所选语言的数据,这些数据也将保存在数据库中,并带有前面描述的表中语言名称的链接。

现在我的编码存在一些问题,因此有些文字显示不正确,如下图所示。我已经拥有的是这里(这里只是维基表中的一行):

header('Content-Type: text/html; charset=utf-8');

$html = '<table class="wikitable sortable jquery-tablesorter" id="Table">
<tbody>
<tr>
<td style="background-color:#ACE1AF;width:#ACE1AF;"></td>
<td><a href="/wiki/Northwest_Caucasian_languages" title="Northwest Caucasian languages">Northwest Caucasian</a></td>
<td><a href="/wiki/Abkhazian_language" class="mw-redirect" title="Abkhazian language">Abkhazian</a></td>
<td lang="ab" xml:lang="ab">аҧсуа бызшәа, аҧсшәа</td>
<td><span class="plainlinks"><a rel="nofollow" class="external text" href="http://www.loc.gov/standards/iso639-2/php/langcodes_name.php?iso_639_1=ab">ab</a></span></td>
<td>abk</td>
<td>abk</td>
<td>abk</td>
<td>also known as Abkhaz</td>
</tr>
</tbody><tfoot></tfoot></table>';

$dom = new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
$rows = $tables->item(0)->getElementsByTagName('tr');
foreach ($rows as $row)
{
    $cols = $row->getElementsByTagName('td');
    echo $cols->item(2)->nodeValue.' ';
    echo $cols->item(3)->nodeValue.' ';
    echo $cols->item(4)->nodeValue.'<br>';
    echo '<hr>';
}

输出如下所示:enter image description here

但是,如果我尝试输出$html,它会正确显示所有内容。我使用谷歌Chrome,上一版本。我需要一些关于它如何工作的线索和提示以及如何使我的工作正常工作。

感谢您的关注。

2 个答案:

答案 0 :(得分:1)

将数据库,表格和列Collation更改为utf8mb4_unicode_520_ci,同时请注意,最长UNIQUE VARCHAR长度为191

据我所知PHPMyAdmin将排序规则设为latin1_swedish_ci为默认值

但不推荐对多语言网站进行整理,

UTF8就是出于这个原因,

同样在名称ci的末尾,这意味着Case Insensitive

答案 1 :(得分:1)

我认为DOMDocument组件无法正常使用不是来自latin 1 charset的字符。

将第$dom->loadHTML($html);行更改为

$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));

这应该有所帮助。

More info in the related answer