mysql - 将混合编码的xml文件数据保存到mysql数据库中的utf-8

标签 mysql xml encoding utf-8 character-encoding

我有一个混合编码的 xml 文件(虽然文件是用 iso-8859-1 编码表示的)但也包含来自 windows 1252 的字符(商标符号、endash 等)

我正在使用 PHP 和 xmlreader 解析 xml 文件以保存在数据库中。 MySQL 5.0 服务器将混合编码的字符保存为方框字符,但 MySQL 5.1 报错。

那么问题来了,正确保存utf-8数据的最简单完整的证明方法是什么。

这是我目前将其转换为 utf-8 的代码,只是想知道转换时是否会产生问题?

 function cp1252_to_utf8($str) 
    {   
       $cp1252_map = array(
                "\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
                "\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
                "\xc2\x83" => "\xc6\x92",     /* LATIN SMALL LETTER F WITH HOOK */
                "\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
                "\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
                "\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
                "\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
                "\xc2\x88" => "\xcb\x86",     /* MODIFIER LETTER CIRCUMFLEX ACCENT */
                "\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
                "\xc2\x8a" => "\xc5\xa0",     /* LATIN CAPITAL LETTER S WITH CARON */
                "\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
                "\xc2\x8c" => "\xc5\x92",     /* LATIN CAPITAL LIGATURE OE */
                "\xc2\x8e" => "\xc5\xbd",     /* LATIN CAPITAL LETTER Z WITH CARON */
                "\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
                "\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
                "\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
                "\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
                "\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
                "\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
                "\xc2\x97" => "\xe2\x80\x94", /* EM DASH */

                "\xc2\x98" => "\xcb\x9c",     /* SMALL TILDE */
                "\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
                "\xc2\x9a" => "\xc5\xa1",     /* LATIN SMALL LETTER S WITH CARON */
                "\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
                "\xc2\x9c" => "\xc5\x93",     /* LATIN SMALL LIGATURE OE */
                "\xc2\x9e" => "\xc5\xbe",     /* LATIN SMALL LETTER Z WITH CARON */
                "\xc2\x9f" => "\xc5\xb8"      /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
            );

            return  strtr(utf8_encode($str), $cp1252_map);
    }


    $sql='SET NAMES "utf8" COLLATE "utf8_swedish_ci"';
    mysql_query($sql);


    $arr_book["booktitle"] = cp1252_to_utf8( iconv("UTF-8", "ISO-8859-1//TRANSLIT", $arr_book["

booktitle"]));

最佳答案

如果您在同一列中有混合编码,您只有一个合理的选择:存储为二进制,而不是特殊的字符集。如果文件在 cp1252 中(它与 ISO-8859-1 有很大一部分重叠,所以您可以声明 cp1252 作为输入), 只需在加载为 XML 之前对其调用 iconv 函数。 ($utf8string = iconv('cp1252','utf-8',$string);)

关于mysql - 将混合编码的xml文件数据保存到mysql数据库中的utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4123698/

相关文章:

mysql - 使用环境变量建立与数据库的连接

xml - 如何在 Sublime Text 3 的 XML 引号内突出显示 LUA 语法?

php - 通过xml向mysql数据库插入数据

perl:捕获 STDOUT- 日志文件最终为二进制文件

java - 如何使用java将日语编码文本(Unicode类型除外)复制到剪贴板?

MySQL 选择查询使用 2 个条件

mysql - Perl/mysql 浮点不精确

mysql - #1064 - 您的 SQL 语法有错误

c# - 同一张表 'tableName'不能是两个嵌套关系中的子表

html - 使用 UTF-8 不显示特殊字符 ">"