【问题标题】:How to avoid Junk/garbage characters while reading data from multiple languages?从多种语言读取数据时如何避免垃圾/垃圾字符?
【发布时间】:2015-07-05 01:01:29
【问题描述】:

我正在解析来自 10 多种不同语言的 RSS 新闻提要。

在我用 php 编写的 API 响应客户端之前,所有的解析都在 java 中完成,数据存储在 MySQL 中。

我在读取数据时经常遇到乱码。

我尝试了什么:

  1. 我有configured my MySQL 来存储utf-8 数据。我的 db、table 甚至列都将 UTF8 作为其默认字符集。
  2. 在连接我的数据库时,我设置了character set results as utf-8

当我手动运行 jar 文件来插入数据时,字符看起来很好。但是当我为同一个 jar 文件设置一个 cronjob 时,我又开始面临这个问题。

在英语中,我特别面临this之类的问题,而在其他白话语言中,字符看起来完全是垃圾,我什至无法识别单个字符。

我有什么遗漏的吗?

垃圾字符示例:

古吉拉特语 :"રેલવે મà«àª¸àª¾àª«àª°à«€àª®àª¾àª, સામાન àªšà«‹àª°à «€ થશે તો મળશે વળતર!"

马来语 : "നേപàµà´ªà´¾à´³à´¿à´²àµ‡à´•àµà´•àµà´³àµà´³ à´•àµ‹à ´³àµâ€ നിരകàµà´•ൠകàµà´±à´šàµà´šàµ"

简体中文:银行局局将范围扩大到金融部门 PSU

【问题讨论】:

  • jar 文件如何组装它插入数据库的数据?通过标准输入?通过文件?
  • 如果您需要特定帮助,您需要显示一些代码。
  • 这里猜测,但系统默认代码页(由“cron”拾取)可能是“C”。即普通的老式ASCII。将您的 java 包装在设置环境“LANG=UTF-8”的脚本中。或者在您的 java 代码中以 UTF-8 显式打开文件。

标签: java php mysql utf-8 character-encoding


【解决方案1】:

古吉拉特语开头રેલવે,对吗?马来语以നേപ 开头,对吗?并且英文应该包含Bureau’s

这是经典案例

  • 客户端中的字节已正确编码为 utf8。 (Bureau 编码在 utf8 的 Ascii/latin1 子集中;但 不是 ascii 撇号。)
  • 您可能默认连接到SET NAMES latin1(或set_charset('latin1') 或...)。 (应该是utf8。)
  • 表中的列被声明为CHARACTER SET latin1。 (或者它可能是从表/数据库继承的。)(应该是utf8。)

数据修复是“2-step ALTER”。

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

长度足够大并且其他“...”具有其他任何内容(NOT NULL 等)已经在列上。

不幸的是,如果您要处理很多列,则需要进行大量 ALTER。对于一对ALTERs 中的单个表,您可以(应该)将所有必要的列MODIFYVARBINARY

代码修复是建立utf8作为连接;这取决于 PHP 中使用的 api。 ALTERs 将更改列定义。

编辑

你有 VARCHAR 错误的 CHARACTER SET。因此,您会看到像 રેલ 这样的 Mojibake。大多数转换技术都试图保留રેલ,但这不是您所需要的。相反,采取措施VARBINARY 会保留这些位,同时忽略表示 latin1 编码字符的位的旧定义。第二步再次保留这些位,但现在声称它们代表 utf8 字符。

【讨论】:

  • 为什么是 VARBINARY?我目前正在使用 varchar。
  • @HIRATHAKUR - VARBINARY 只是一块垫脚石。它用于在应用新编码之前“忘记”旧编码。一步完成转换会失败,因为它会曲解原文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多