修复Unicode字节序列

时间:2009-02-11 19:41:53

标签: sqlite postgresql vim unicode

有时将内容复制到PostgreSQL中时,我会收到错误的字节序列无效。

是否有一种简单的方法可以使用vim或其他实用程序来检测导致错误的字节序列,例如:无效的无效字节序列,用于编码“UTF8”:0xde70 以及诸如此类,可能和简单的方法做转换?

编辑:

我的工作流程是:

  1. 转储sqlite3数据库(来自trac)
  2. 尝试在postgresql中重播
  3. 也许有一种更简单的方法?

    更多编辑:

    还试过这些:

    1. 运行enca以检测文件的编码

      • 告诉我这是ASCII
    2. 尝试使用iconv将ASCII转换为UTF8。出现错误

    3. 有什么工作正在删除它抱怨的那对错误的行。但这并没有真正解决真正的问题。

3 个答案:

答案 0 :(得分:4)

基于一个简短的句子,听起来你有一个编码的文本(例如ANSI / ASCII),你告诉PostgreSQL它实际上是另一种编码(Unicode UTF8)。您将使用的所有不同工具:PostgreSQL,Bash,一些编程语言,另一种编程语言,来自其他地方的其他数据,文本编辑器,IDE等,都具有可能不同的默认编码,以及一些步骤顺便说一句,正确的转换没有完成。我会检查它跨越这些边界的数据流,以确保编码排列,或正确检测编码并正确转换文本。

答案 1 :(得分:1)

如果您知道转储文件的编码,可以使用recode将其转换为utf-8。例如,如果它是用latin-1编码的:

recode latin-1..utf-8 < dump_file > new_dump_file

如果你不确定编码,你应该看看如何配置sqlite,或者尝试一些反复试验。

答案 2 :(得分:1)

我明白了。这不是一个编码问题。

SQLite的输出转义字符串与Postgres预期的不同。有些情况下输出'asdf \ xd \ foo'。我相信'\ x'导致它期望以下字符是unicode编码。

解决方案是在sqlite 3中以CSV模式单独转储每个表。

第一

sqlite3 db/trac.db .schema | psql

现在,这在大多数情况下都可以将数据复制回来

for table in `sqlite3 db/trac.db .schema | grep TABLE | sed 's/.*TABLE \(.*\) (/\1/'`
do              
echo ".mode csv\nselect * from $table;" | sqlite3 db/trac.db | psql -c "copy $table from stdin with csv"
done

是的,有点像黑客,但它有效。