0

我在编码某个文件时遇到了麻烦。在我的 php 程序中,我得到一个 txt 文件。使用 foreach 并从此文件中获取每一行并做一个表,接下来我尝试将这些数据放入我的数据库中,插入后我在数据库中没有波兰字母。我的数据库、表和所有字段都有一个 utf8_unicode_ci ,当我使用 phpmyadmin 进行插入时,所有字母都是正常的。我尝试使用 detect_encoding($row),它检测 ASCII 解码。如何将波兰字母插入我的数据库?请帮忙。

我的数据库连接:

try{
  $dbh = new PDO('mysql:dbname=google;host=localhost;','root','');  
  $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
  $dbh -> query ('SET NAMES utf8');
  $dbh -> query ('SET CHARACTER_SET utf8_unicode_ci');}

我试试

$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));

$url = Encoding::toUTF8($url);

和 ofc iconv 还有其他想法吗?

在我的插入中一切正常,这是一个例子:

PDOStatement Object ( [queryString] => insert into `site` values ("","meblegdańsk.pl","1") ) 
4

2 回答 2

0

你的mysql查询是错误的。它是(注意和之间的空格而SET CHARACTER SET utf8_unicode_ci不是下划线。这可能是最有可能导致您出现问题的原因。SETCHARACTER

在一些奇怪的 MySQL 配置上,您可能需要设置其他与字符编码相关的东西(但您通常不需要,所以不要乱搞这些不必要的东西):http ://dev.mysql.com/doc/refman/5.0/en /charset-connection.html

顺便说一句,这不会单独工作(除非你mb_detect_order先用过):

$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));

如果您想将 latin2 字符转换为 utf-8,但如果它们已经是 utf-8,则不要理会它们,您应该这样做:

$url = mb_convert_encoding($url, 'UTF-8',array ('UTF-8', 'ISO-8859-2'));
// or
mb_detect_order(array ('UTF-8', 'ISO-8859-2'));
$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url));

抱歉,如果您以前已经使用过这样的方法mb_detect_order()。给其他人的注意事项:ISO-8859-2 应该替换为您希望找到的任何其他编码,这可能取决于您说的语言。在大多数西欧国家,ISO-8859-1 是通常使用的 1-字节字符编码。

无论如何,这允许检查给定字符串是否是有效的 UTF-8(因此不会更改它),或者如果它不是有效的 UTF-8,它会假定它是 ISO-8859-2 并转换它。顺序很重要,因为每个字符串都是有效的 ISO-8859-2,您永远无法“退回”到 UTF-8。我还假设当你说 ASCII 时,你的意思是 ISO-8859-2(它们不是一回事)。

另外,为了使我的回答完整,我还想提醒您,您应该确保表中的每一列也设置为使用 utf8 编码。

于 2013-10-08T10:23:03.487 回答
0

我怀疑mb_detect_encoding()不像你想的那样工作:

字符串 mb_detect_encoding (字符串 $str [, 混合$encoding_list = mb_detect_order() [, bool $strict = false ]])

如果您省略第二个参数,您通常会在两种编码之间进行选择

Array
(
    [0] => ASCII
    [1] => UTF-8
)

最后,您要询问波兰语文本是 ASCII 还是 UTF-8 并将结果转换为 UTF-8。问题:

  • ASCII 是 UTF-8 的子集。从 ASCII 转换为 UTF-8 永远不会改变您的输入数据。
  • ASCII 不能编码波兰语字符。

很难说为什么你ASCII在没有样本数据的情况下获得输出——如果文本显然不是 UTF-8,PHP 可能默认为 ASCII,但将严格编码检测标志设置为false无济于事。

我建议您重新考虑为什么首先需要检测编码。如果应用程序不要求输入文件采用特定编码并且无法更改该要求,我建议您编译波兰文本中的典型编码列表并mb_detect_encoding()提供它。

BTW,设置连接编码的推荐方法是charsetDSN中的参数:

$dbh = new PDO('mysql:dbname=google;host=localhost;charset=utf8','root','');  
于 2013-10-08T10:43:09.860 回答