将混合编码的XML文件数据保存为UTF-8格式在MySQL数据库中。

4

我有一个混合编码的xml文件(该文件应使用iso-8859-1编码),但也包含来自windows 1252的字符(商标符号,破折号等)

我正在使用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"]));
1个回答

1

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


是的,我已经更新了我的问题,您可以看到我正在使用的当前代码。如果一个字符串不包含混合编码,它将不会从Windows 1252进行转换,对吗?另外,函数cp1252_to_utf8将需要修改字符,而不是列在数组$cp1252_map中的字符。 - Gajendra Bang
1
我没有简单的方法来验证您的自定义cp1252_to_utf8函数(如果iconv函数如此易于使用,为什么要重新发明它?),即使在Linux系统上,直接使用iconv('CP1252','UTF-8',$string);应该可以正常工作,忘记他们声称它是ISO-8859-1,显然不是,它们之间唯一的区别是据我所知0x80到0x9F范围。 - Wrikken
好的,我会检查 **iconv('CP1252','UTF-8',$string);**。 - Gajendra Bang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接