我怎样才能在全局忽略UTF-8字符串无效的字节序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎样才能在全局忽略UTF-8字符串无效的字节序列相关的知识,希望对你有一定的参考价值。

如果你只是想在原始字节进行操作,你可以试试它的编码为ASCII-8BIT /二进制。
str.force_encoding("BINARY").split("n")

这不会让你的U回来,不过,因为在这种情况下,源字符串为ISO-8859(或喜欢):
"- Men\\xFC -".force_encoding("ISO-8859-1").encode("UTF-8")
=> "- Menü -"

如果你想获得multibyte字符,你必须知道的源字符集是什么。
一旦你force_encoding如果数据是从您的数据库,你可以改变你的ASCII-8BIT或二进制编码;ruby应该举报他们据此即可。或者,您可以monkeypatch数据库驱动程序来强制编码的读取它的所有字符串。这是一个巨大的,虽然,可能是完全错误的做法。
正确的答案将是解决你的字符串编码。这可能需要它们的数据库修复,数据库驱动程序连接的编码修复,或combinations。所有的字节仍然存在,但如果你正在处理一个给定的字符集,你应该,如果可能的话,让ruby知道,你希望你的数据在该编码。错误是mysql2驱动程序连接到已在拉丁文编码数据的MySQL数据库,但要指定UTF-8字符集进行连接。该导轨从DB取拉丁文的数据并把它解释为UTF-8,而不是将其解释为拉丁文,然后可以转换为UTF-8。
如果你能在这里阐述的字符串中,答案是可能的。您也可以看看这个答案的可能的全局(-ish)Rails的解决方案,默认字符串编码。
参考技术A   如果你只是想在原始字节进行操作,你可以试试它的编码为ASCII-8BIT /二进制。
  str.force_encoding("BINARY").split("n")

  这不会让你的U回来,不过,因为在这种情况下,源字符串为ISO-8859(或喜欢):
  "- Men\xFC -".force_encoding("ISO-8859-1").encode("UTF-8")
  => "- Menü -"

  如果你想获得multibyte字符,你必须知道的源字符集是什么。
  一旦你force_encoding如果数据是从您的数据库,你可以改变你的ASCII-8BIT或二进制编码;ruby应该举报他们据此即可。或者,您可以monkeypatch数据库驱动程序来强制编码的读取它的所有字符串。这是一个巨大的,虽然,可能是完全错误的做法。
  正确的答案将是解决你的字符串编码。这可能需要它们的数据库修复,数据库驱动程序连接的编码修复,或combinations。所有的字节仍然存在,但如果你正在处理一个给定的字符集,你应该,如果可能的话,让ruby知道,你希望你的数据在该编码。错误是mysql2驱动程序连接到已在拉丁文编码数据的MySQL数据库,但要指定UTF-8字符集进行连接。该导轨从DB取拉丁文的数据并把它解释为UTF-8,而不是将其解释为拉丁文,然后可以转换为UTF-8。
  如果你能在这里阐述的字符串中,答案是可能的。您也可以看看这个答案的可能的全局(-ish)Rails的解决方案,默认字符串编码。

来自平面文件的 GPFdist 插入会在插入时引发错误“用于编码“UTF8”的字节序列无效:0x00”

【中文标题】来自平面文件的 GPFdist 插入会在插入时引发错误“用于编码“UTF8”的字节序列无效:0x00”【英文标题】:GPFdist insert from flat file throws error 'invalid byte sequence for encoding "UTF8": 0x00' on insert 【发布时间】:2017-08-24 16:01:02 【问题描述】:

我在写入以从大型平面文件中提取数据的过程中遇到问题。我正在使用具有 UTF8 规范的 python 包装器预处理平面文件,如下所示: wrFile = io.open("outFile","w+",encoding='utf8')

我正在使用以下命令逐行读取源文件: lineACT = linecache.getline("inFile", i+j) lineNxt = linecache.getline("inFile", i+j+1)

进一步,在预处理这些行之后,我正在编写如下文件: wrFile.write(lineACT) 因此,遍历 infile 中的行数,我正在创建 outfile。

现在可以使用以下查询将文件提取到外部postgresql 表中。加载器应用程序是用Java 编写的,所有配置都使用属性文件传递:

-- CREATE EXTERNAL TABLE FOR A SPECIFIC CLIENT
CREATE  EXTERNAL TABLE outTable (  col1 character(3), col2 
character(3),..... )
LOCATION ( '<LocationOf outFile>' )
FORMAT    'CUSTOM' (formatter=fixedwidth_in,col1='3',col2='3'......)
LOG ERRORS INTO errorTable SEGMENT REJECT LIMIT 2 ROWS;

-- INSERT INTO DELTA TABLE
INSERT  INTO deltaTable
SELECT  col1, col2,......
FROM    outTable
;

-- DROP EXTERNAL TABLE
DROP  EXTERNAL TABLE IF EXISTS outTable;

UNIX 盒子上运行它会引发异常:

Cause: org.postgresql.util.PSQLException: ERROR: Segment reject limit reached. Aborting operation. Last error was: Expected line size from the formatting string: 1655, but the actual size is: 455  (seg43 slice1 uxpbdpsdw06.dstcorp.net:1028 pid=335160)

注意: outFile 中的每一行是 1655 个字符。 outTabledeltaTable 的列结构也是 1655。 当我检查 errorTable 时,我在 errmsg 列中找到了这个:

invalid byte sequence for encoding "UTF8": 0x00

现在,我猜测数据库不接受文件中的null 字符'0x00',因为我检查的数据库的编码属性是'UTF8'

我尝试使用以下 bash 命令从文件中删除空字符:

sed 's/\x0/-9/g' outFile > outFile_

&

tr < outFile -d '\000' > outFile_

但到目前为止还没有任何效果。有人可以就如何使这项工作提出一些建议吗?

--

提前致谢!

【问题讨论】:

您确认“outFile_”实际上已经删除了空字节吗?您是否也将“outFile”替换为“outFIle_”,或者更改表以从“outFile_”加载数据? 如果您在 Python 中进行预处理,那么为什么不去除空字节呢? line.replace("\0","") 或其他,假设它们在其他方面毫无意义。 【参考方案1】:

大多数情况下,只要数据具有不可打印的字符,就会遇到此特定错误。我的建议是用空格替换不可打印的字符并执行查询

【讨论】:

以上是关于我怎样才能在全局忽略UTF-8字符串无效的字节序列的主要内容,如果未能解决你的问题,请参考以下文章

1字节的UTF-8序列的字节1无效

Eclipse * 字节的 UTF-8 序列的字节 * 无效。

Paypal IPN:UTF-8 中的无效字节序列

3 字节的 UTF-8 序列的字节 2 无效

UTF-8 中的无效字节序列 (ArgumentError)

Activiti MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。