我在使用字符编码方面遇到了一些麻烦。
情况
上传的文件将转换为XML。此文件的字符编码会有所不同,但可能会出现智能引号,实体和各种ASCII。将此文件转换为XML后,它将存储在数据库中。根据用户请求,可以从数据库中提取XML并将其转换为数组,然后将其创建为PDF。
问题
字符编码。从一开始,字符编码就出现了一个重大问题。我想知道;
°
)时无法识别的’
。智能引用将变为’
等等。Å
。尝试解决
我已经做了各种“尝试”解决我的问题的功能 - 将一些角色转换成另一个角色。但是,我认为这是完全错误的做法,我应该更改字符编码。
/*
* Converts smart quotes to ascii
*/
function convert_smart_quotes($string) {
$string = iconv("UTF-8", "UTF-32", $string);
$string = mb_convert_encoding($string, 'HTML-ENTITIES', 'UTF-32');
$string = str_replace('', '', $string);
$search = array('‘', '’', '“', '”', '—');
$replace= array("'", "'", '"', '"', '-');
$string = str_replace($search, $replace, $string);
return $string;
}
/*
* Converts some entities to an ISO format?
*
* Example : ° => °
*/
function entity_to_iso($string) {
return html_entity_decode($string, ENT_QUOTES & ~ENT_COMPAT, 'ISO-8859-1');
}
最终,我的问题在于我不知道上传文件的编码。我有一个switch
的想法,试图将字符转换为更多的数据库和“PDF友好”。然而,很多谷歌搜索引起了苦恼的工作或阵列str_replace
一件事。这真的是解决方案吗?
任何指向更好方向的建议,解决方案或手指都非常有用并且非常感激。谢谢。
答案 0 :(得分:0)
检测文件的编码是一个难题,UTF很容易,因为它在开头有一个BOM,但是否则几乎不可能正确地确定编码类型。
但是,如果XML格式正确,则应该在其中嵌入编码,并且解析器应该很好地处理它。我看到你正在进行从UTF-8到UTF-32的转换,这根本不会有任何帮助,因为它只会使字符串变大,但它不会改变用于编码字符的代码点。
因此,您应该能够向XML解析器询问文件的编码,然后在存储和/或处理之前将其从该文件更改为UTF-8(或32)。
答案 1 :(得分:0)
如果我是你,我会做两件事之一。我要么只是在数据库中存储没有任何编码的东西(作为blob),所以数据库编码根本不会进入它。
您可以做的另一件事是根本不将信息存储在数据库中。只需将其存储在一个文件中(将该文件命名为某些独特的哈希值),然后在数据库中创建一个表,该表存储具有xml的文件的位置。然后你可以直接从文件中提供xml。