【问题标题】:Reading french characters in Java在Java中读取法语字符
【发布时间】:2015-01-20 20:04:41
【问题描述】:

我必须完成一项类似于 Web 索引的任务。基本上我有几个文件(ASCII 格式),我必须计算词频。

其中一个文件包含法语字符(例如 ç 或 è)。在我的输出文件中,一些包含法语字符的单词显示不正确,因此我有重复项: 我有 grimaçaient 和 grima��aient,例如,我有 guère 和 gu��re。

现在,关于使用的算法,有一个问题。我必须以并行方式进行计算,这涉及将文本文件拆分为片段(不是将文件拆分为多个文件,而是从文件的某个偏移量读取)。对于每个片段,我必须检查第一个单词是否已在两个片段之间拆分:如果是,我可以忽略它,并且我还必须检查最后一个单词是否已拆分:如果是,我必须阅读更多字符直到我到达一个分隔符并将其保存在我的缓冲区中。我认为奇怪的...可能与这部分有关。

这就是我阅读片段的方式:

byte[] buffer = new byte[D]; // D is 1024
file.seek(offset);
file.readFully(buffer);

这就是我阅读外围单词的方式。

对于第一个单词:

file.seek(offset - 1);
byte[] buf = new byte[1];
buf[0] = file.readByte();
String first_w = new String(buf);

最后一句话:

String last_word = "";
byte[] buf = new byte[1];
do
{
    buf[0] = file.readByte();
    String aux = new String(buf);
    if(isDelim(aux.charAt(0))
    {
        break;
    }
    else
    {
        last_word += aux;
    }
}while(true);

�出现在一些开头的词中,出现在一些最后的词中,也许最重要的是,如果 � 出现在片段的主要部分(我用 readFully 阅读的那个),那么 � 将作为字符串中的第一个字母或最后一个字母出现。

我该如何解决这个问题?

编辑:该文件是一个 RandomAccessFile 对象。

【问题讨论】:

  • 文件编码是什么,UTF-8 还是 ISO-8859-15?会有一些显着差异。
  • 如果文件包含 ç 或 é,那么它不是 ASCII,因为 ASCII 不支持这些字符。使用 Reader 和适当的字符集将字符读取为字符,而不是尝试将它们读取为字节。 new String(buf)不使用适当的字符集。它使用您的默认字符集。阅读 javadoc。
  • 编码为 ISO-8859 文本。

标签: java string character ascii


【解决方案1】:

当您使用RandomAccessFile 读取文件时,我担心没有太多内置支持来正确处理文件编码。

如果您的文件采用 ISO-8859-15 编码,则非常简单。在这种情况下,您可以使用new String(byte[], "ISO-8859-15")

如果您的文件是用 UTF-8 编码的,您必须处理这样一个事实,即 Unicode 代码点 > 127 的字符被编码为超过 1 个字节。但这很简单。 如果第一位为 0(字节值 >= 0),则为单字节字符。 如果第一位是 1(字节值

【讨论】:

    【解决方案2】:

    不要使用new String(byte[] buf) 构造函数。它不考虑字节的编码(并使用平台默认值)。使用new String(byte[] buf, String encoding) 并指定正确的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 2011-09-06
      • 2018-02-05
      相关资源
      最近更新 更多