我正在解析 10 多种不同语言的 RSS 新闻提要。
在我用 php 编写的 API 响应客户端之前,所有解析都是在 java 中完成的,数据存储在 MySQL 中。
我在读取数据时经常遇到垃圾字符。
我尝试过什么:
- 我有configured my MySQL存储utf-8数据。我的数据库、表甚至列都将 UTF8 作为默认字符集。
- 在连接我的数据库时,我设置了 character set results as utf-8
当我手动运行 jar 文件来插入数据时,字符显示正常。但是当我为同一个 jar 文件设置一个 cronjob 时,我开始再次面临这个问题。
在英语中,我特别面临类似this这样的问题。而在其他白话里,这个字就显得很乱,一个字我都认不出来。
我有什么遗漏的吗?
垃圾字符示例:
古吉拉特语 :"રેલવે મà«àª¸àªªàª«àª°à«€àª®àªªª‚ સપª®àªªàªù ચà«àª°à «€ થશે ત૪®àª3શે વળતર!"
马拉雅拉姆语:“ഴേപàµà´ªà´ªà´3ിലേകàµà´•àµà´³àµà´³ à´•àµ´à ´³àµâ€ à´´à´¿à´°à´•àµà´•àµ à´•àµà´±à´šàµà´šàµ"
中文:银行董事会局的范围扩大到金融部门事业单位
最佳答案
古吉拉特语开始રેલવે
,对吗?马拉雅拉姆语以 നേപ
开头,对吗?英语中应该包括 Bureau's
。
这是一个经典案例
- 客户端中的字节已正确编码为 utf8。 (
Bureau
采用 utf8 的 Ascii/latin1 子集进行编码;但'
不是 ascii 撇号。) - 您可能默认使用
SET NAMES latin1
(或set_charset('latin1')
或...)进行连接。 (应该是utf8
。) - 表中的列被声明为
CHARACTER SET latin1
。 (或者可能是从表/数据库继承的。)(应该是utf8
。)
数据修复是“两步更改”。
ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;
其中长度足够大,而另一个“...”有其他任何内容(NOT NULL
等)已经在列上。
不幸的是,如果您有很多列需要处理,则需要进行大量的 ALTER。您可以(应该)将一对ALTERs
中的单个表的所有必需列MODIFY
为VARBINARY
。
代码的修复是建立utf8作为连接;这取决于 PHP 中使用的 api。 ALTERs
将更改列定义。
编辑
您的 VARCHAR
的 CHARACTER SET
不正确。因此,您看到的 Mojibake 类似于 રેલ
。大多数转换技术都会尝试保留 રેલ
,但这不是您所需要的。相反,采取 VARBINARY
的步骤会保留这些位,同时忽略表示 latin1 编码字符的位的旧定义。第二步再次保留这些位,但现在声称它们代表 utf8 字符。
关于java - 从多种语言读取数据时如何避免垃圾字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29881114/