当有带重音的英文字母时,字符串的一部分会丢失


Part of string is lost when there is an accented English letter

我有一段代码可以将匈牙利语的CSV文件导入MySQL表。一切都很好,直到它在要插入的字符串中遇到一个带重音的字符,比如Ş,éetc。重音字母后的任何字符都将从字符串中删除,只有剩余的字符插入到表中。例如,插入"Artículos Erâ³ticos"作为"Art"

代码中没有复杂的内容。要读取的代码如下所示

$content = file_get_contents($this->request->files['import']['tmp_name']);
$lines = explode("'n",$content);
foreach($lines as $line) {
    //Skip header row and empty lines
    if ($lineno != 1 && (!empty($line)))  {
        $fields = explode(";",$line);

INSERT查询是使用$fields形成的,并使用mysql_query插入。浏览器窗口中查询的回显显示完整字符串,但数据库只有部分字符串。我想知道这是否与mysql设置或unicode字符串有关。

使用mbstring

mbstring提供多字节特定的字符串函数,可帮助您处理PHP中的多字节编码。除此之外,mbstring处理可能编码之间的字符编码转换成对。mbstring设计用于处理基于Unicode的编码,例如UTF-8和UCS-2以及许多方便的单字节编码(列出以下)。。。。mbstring是一个非默认扩展。这意味着它不是由违约必须使用configure显式启用模块选项

  • 有关安装mbstring的详细信息:http://www.php.net/manual/en/mbstring.installation.php
  • PHP运行时配置:http://www.php.net/manual/en/mbstring.configuration.php

原因:PHP太旧了。UTF-8刚问世时并没有被广泛使用。即使PHP5已经发布,这个遗留的"特性"仍然存在。为了减轻由此引起的问题(例如,em破折号"--"将在正常字符串中产生类似的问题)