【问题标题】:Wrong Encoding after Converting .txt to .sql File将 .txt 转换为 .sql 文件后编码错误
【发布时间】:2018-01-14 15:30:46
【问题描述】:

我有一个 .txt 文件,其中包含数百万个邮政编码。 有所有格式良好(可读)。 我的目标是将邮政编码导入 MySql 数据库。
我需要将 .txt 文件中的邮政编码转换为 .sql 文件。

我编写了一个 Java 应用程序来将重要部分转换为 SQL 文件。

编辑: .txt 文件包含许多信息。这就是为什么我要读取文件(在 Java 中),过滤文件内容并最终创建一个 .sql 文件。非常感谢任何用“Python、SQL、C++、BrainF***”或其他语言编写的解决方案,但我希望为我的特定 Java 代码提供解决方案。 .txt 文件使用 UTF-8 编码。

转换成“.sql”后,内容有几个问题。 例如,西里尔字符“Я”在 SQL 文件中不是“known”。 我认为,编码是错误的。
如果有人可以帮助我了解如何解决这个问题,那就太好了。

TXT-文件: TXT-File

SQL 文件:SQL-File

try (BufferedReader br = new BufferedReader(
            new FileReader(GeoData.class.getResource(sourceFilenameInput.getText().trim()).getFile().trim()))) {
        for (String line; (line = br.readLine()) != null;) {
            GeoData geoData = new GeoData();
            geoData.addOrt(getPlaceFromFile(line));
        }

getPlaceFromFile 方法:

private String getPlaceFromFile(String line) {
    String[] placeHolder = line.split("\t");
    if (placeHolder .length > 2) {
        for (int i = 0; i < placeHolder .length - 2; i++) {
            if (!placeHolder [i + 2].trim().isEmpty() && placeHolder [i + 2].trim().length() > 3) {
                return filterPlace(placeHolder [i + 2].trim(), "'", "\\", "^", ";", "*", "|");
            }
        }
    }
    return "EMPTY";
}

FilterPlace 方法:

private String filterPlace(String place, String... filter) {
    String newPlace = place;
    for (String string : filter) {
        if (newPlace .trim().contains(string))
            newPlace = newPlace .trim().replace(string, " ");
    }
    return newPlace;
}

到目前为止我尝试了什么?
我将FileReader 替换为InputStreamReader,并将FileInputStream 与字符集UTF-8 一起使用。在 UTF-8 转换后,SQL 文件如下所示:
UTF8 Converted SQL-FILE

【问题讨论】:

  • 你能得到.txt文件中包含Я的行的十六进制吗?
  • D18F я D0AF Я -- 您询问的是大写 YA,但显示的是小写 YA。
  • 第 6 行中完整字符串的十六进制:c390e2809dc391e282acc391efbfbdc390c2bdc390c2bac390c2bec390c2b2c390c2b5c391e280a0202f2044726a616e6b6f766563
  • Я 只是一个例子……还有更多未知的西里尔字符(如我的问题中所述)
  • 去掉旧的实用程序类 FileReader 和 FileWriter 就好了。只是小西里尔字母 ya 似乎已损坏。你在某个地方有 new String(string.getBytes(str, ...), ...) / 带有 0x8F 的东西吗?

标签: java mysql file encoding filereader


【解决方案1】:

我找到了答案。

我刚刚从eclipse编辑了编码格式来解决问题。

Workspace > Preferences > General > 点击Workspace并将Text file encodingCp1252编辑为UTF-8

就是这样,它奏效了。

【讨论】:

    【解决方案2】:

    如果 .txt 列在 \t 上拆分,请在加载前不要转换。而是简单地使用LOAD DATA INFILE ... SQL 语句,类似于

     LOAD DATA LOCAL INFILE 'the_file.txt'
         INTO tablename
         CHARACTER SET utf8mb4
         COLUMNS TERMINATED BY "\t"
         LINES TERMINATED BY "\n"
         (col1, zip, name);
    

    我不知道如何从 Java 中运行它。但是您提供的任何代码都不需要。

    您的评论中有一些垃圾--

    E2808B     8203=x200B  [​]   BN  ZERO WIDTH SPACE
    E2808C     8204=x200C  [‌]   BN  ZERO WIDTH NON-JOINER
    

    (我通过双击十六进制复制它发现了它。但它停在中间!)

    Д 是十六进制 D094,但如果你 double encode 它,你会得到十六进制 C390 E2809D。请参阅该链接以了解可能的原因。

    【讨论】:

    • 抱歉,我不明白你的回答...我不知道你到底想从我这里得到什么。
    • 请告诉我,我在整个代码中的编码位置。我找不到它。
    • 扔掉你的转化码,改用LOAD DATA。如果您仍然得到C3... 而不是D0...,请阅读“双重编码”。您还没有在所有需要的地方设置“utf8”。
    • (不用担心 E2...;解决剩下的问题。)
    • 你现在很神秘,瑞克。我应该在哪里添加“加载数据”?我真的不明白。如果你能更具体一点,那就太好了。例如:“嘿,第二行代码,将 XX 替换为 YY 就可以了;)”
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2021-12-24
    • 2017-02-09
    • 2017-09-23
    • 2014-06-11
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多