用Java阅读法语字符
我必须做一个类似于网页索引的作业。基本上我有几个文件(ASCII格式),我必须计算单词频率 其中一个文件包含法语字符(如çorè)。在我的输出文件中,一些包含法语字符的单词没有正确显示,因此我有重复的单词: 我有grimaçaient和grima��艾恩特,我有古埃和古埃��例如,re 现在,关于使用的算法,有一个问题。我必须以并行方式进行计算,包括将文本文件拆分为片段(不是将文件拆分为多个文件,而是从文件的某个偏移量读取)。对于每个片段,我必须检查第一个单词是否已在两个片段之间拆分:如果是,我可以忽略它,我还必须检查最后一个单词是否已拆分:如果是,我必须读取更多字符,直到找到分隔符并将其保存在缓冲区中。我觉得这很奇怪� 可能与这部分有关 下面是我如何阅读片段的:用Java阅读法语字符,java,string,character,ascii,Java,String,Character,Ascii,我必须做一个类似于网页索引的作业。基本上我有几个文件(ASCII格式),我必须计算单词频率 其中一个文件包含法语字符(如çorè)。在我的输出文件中,一些包含法语字符的单词没有正确显示,因此我有重复的单词: 我有grimaçaient和grima��艾恩特,我有古埃和古埃��例如,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);
� 出现在开头的一些词中,最后的一些词中,也许最重要的是如果� 出现在片段的主要部分(我阅读时已准备就绪的部分)中� 将显示为字符串中的第一个字母或最后一个字母
我怎样才能解决这个问题
编辑:文件是RandomAccessFile对象。不要使用
新字符串(byte[]buf)
构造函数。它不考虑字节的编码(并使用平台默认值)。使用新字符串(byte[]buf,String encoding)
并指定正确的编码。当您使用RandomAccessFile
读取文件时,恐怕没有多少内置支持来正确处理文件编码
如果您的文件是以ISO-8859-15编码的,那么它非常简单。在这种情况下,您可以使用新字符串(字节[],“ISO-8859-15”)
如果您的文件是用UTF-8编码的,那么您必须处理这样一个事实,即Unicode代码点>127的字符的编码超过1个字节。但这很简单。
如果第一位为0(字节值>=0),则为单字节字符。
如果第一位是1(字节值文件编码是什么,UTF-8还是ISO-8859-15?会有一些显著的区别。如果文件包含ç或é,那么它不是ASCII,因为ASCII不支持这些字符。使用读取器和适当的字符集将字符作为字符读取,而不是尝试将其作为字节读取。
新字符串(buf)
未使用适当的字符集。它使用默认字符集。请阅读javadoc。编码为ISO-8859文本。