我在编码某个文件时遇到了麻烦。在我的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") )
答案 0 :(得分:0)
您的mysql查询错误。它是SET CHARACTER SET utf8_unicode_ci
(注意空格而不是SET
和CHARACTER
之间的下划线。这可能是导致问题的最可能原因。
在一些奇怪的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编码。
答案 1 :(得分:0)
我怀疑mb_detect_encoding()并不像你想象的那样工作:
string mb_detect_encoding(string $ str [,mixed $ encoding_list = mb_detect_order() [,bool $ strict = false]])
如果省略第二个参数you're often choosing between two encodings:
Array
(
[0] => ASCII
[1] => UTF-8
)
最后,您要询问波兰文字是ASCII还是UTF-8,并将结果转换为UTF-8。问题:
很难说为什么在没有样本数据的情况下获得ASCII
作为输出 - 如果文本显然不是UTF-8但是有严格编码检测,则PHP可能默认为ASCII 标志设置为false
无法提供帮助。
我建议你重新考虑为什么你需要首先检测编码。如果应用程序不要求输入文件处于特定编码状态且无法更改必要条件,我建议您在波兰语文本中编译典型编码列表,并使用它来mb_detect_encoding()
。
BTW,设置连接编码的推荐方法是DSN中的charset
参数:
$dbh = new PDO('mysql:dbname=google;host=localhost;charset=utf8','root','');