我有一个项目将以任何可能的语言接收数据。现在我正试图解析维基页面并获取list of languages并将其放入数据库。在解析步骤中,我发现大多数本地名称都显示为" "(空方格和东西)和其他奇怪的符号。定义的字符集是UTF-8。
我不确定这是如何运作的,也不知道在哪里进一步挖掘。我无法在网站上找到有关多语言内容的任何信息。我是否应该使用所有符号的代码来使用它们?如何使这项工作?
我需要:
现在我的编码存在一些问题,因此有些文字显示不正确,如下图所示。我已经拥有的是这里(这里只是维基表中的一行):
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>';
}
但是,如果我尝试输出$html
,它会正确显示所有内容。我使用谷歌Chrome,上一版本。我需要一些关于它如何工作的线索和提示以及如何使我的工作正常工作。
感谢您的关注。
答案 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'));
这应该有所帮助。