数据库、字符编码、PDF和XML


Databases, character encoding, PDFs and XML

我在字符编码方面遇到了一些小麻烦。

情况

将上载一个转换为XML的文件。该文件的字符编码各不相同,但可能会出现智能引号、实体和各种ASCII。一旦这个文件被转换成XML,它就会被存储在数据库中。根据用户请求,XML可以从数据库中提取并转换为数组,然后在其中创建为PDF。

问题

字符编码。从一开始,字符编码就一直是一个主要问题。我想知道;

  • 什么字符编码通常涵盖整个"频谱"。例如,解析XML时未识别的°或智能报价()。智能报价将变成’
  • 如何在数据库中存储XML。加密是可能的,但是数据库编码是我迷失的地方
  • 如何使实体、智能引号(以及其他可能导致问题的字符)正确显示在数据库中,并在内容前面显示Å

尝试绕过

我制作了各种函数来"尝试"解决我的问题——将一些字符转换为另一个字符。然而,我认为这是完全错误的操作方式,我应该更改字符编码。

/*
 * 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的痛苦的解决方案或数组。这真的是解决方案吗?

任何建议、解决方案或指向更好方向的手指都是有用的,非常感谢。非常感谢。

如果我是你,我会做两件事中的一件。我要么只将没有任何编码的东西存储在数据库中(作为一个blob),这样数据库编码就不会进入其中。

您可以做的另一件事是根本不将信息存储在数据库中。只需将其存储在一个文件中(将文件命名为唯一的散列),然后在数据库中创建一个表,存储包含xml的文件的位置。然后您可以直接从文件中提供xml。

检测文件的编码是一个难题,UTF很容易,因为它一开始就有BOM,但除此之外,几乎不可能正确确定编码类型。

然而,如果XML格式正确,那么它应该嵌入编码,解析器应该很好地处理它。我看到你正在进行从UTF-8到UTF-32的转换,这根本没有帮助,因为它只是让字符串变大了一点,但它不会改变用于编码字符的代码点。

因此,您应该能够向XML解析器询问文件的编码,然后在存储和/或处理之前将其更改为UTF-8(或32)。