Java FileReader encoding issue
我试图使用java.io.filereader读取一些文本文件并将它们转换为字符串,但我发现结果编码错误,根本不可读。
这里是我的环境:
Windows 2003,OS编码:CP1252
爪哇5
我的文件是UTF-8编码或CP1252编码的,其中一些(UTF-8编码的文件)可能包含中文(非拉丁语)字符。
我使用以下代码来完成我的工作:
上面的代码不起作用。我发现文件阅读器的编码是CP1252,即使文本是UTF-8编码的。但是java.io.filereader的javadoc说:
The constructors of this class assume
that the default character encoding
and the default byte-buffer size are
appropriate.
这是否意味着如果我使用FileReader,就不需要自己设置字符编码?但是我现在确实得到了错误的编码数据,正确的处理方法是什么?谢谢。
- You should also the inside the Loose string.valueof(环)和使用stringbuffer.append(字符数组directly,int,int)。这节省了很多of Copying of the字符数组。replace with也使用StringBuffer。of this is about你不是问题,不过。
- 你说的对你有恩,but the right after the part读Javadoc糊你?你知道,我说"to the part specify这些值construct安在自己inputstreamreader在线fileinputstream。"?
- 你清楚的知道thanks for the,读Javadoc,but is not sure - whether or not AM specify这些值应该与自己的"construct开关安在fileinputstream inputstreamreader在线"。
- 是的,如果你知道the other is something比文件中的默认编码平台,You have to tell the inputstreamreader which one to使用。
是的,您需要指定要读取的文件的编码。
是的,这意味着您必须知道要读取的文件的编码。
不,没有一般的方法来猜测任何给定的"纯文本"文件的编码。
FileReader的构造函数总是使用平台默认编码,这通常是一个坏主意。
您需要使用new InputStreamReader(new FileInputStream(pathToFile), ),而不是filereader。
- inputstream is=new fileinputstream(文件名);这里有一个错误文件,文件名为俄语时找不到错误。
- +1对于使用inputstreamreader的建议,但是在代码块中使用链接会使复制和粘贴代码变得困难,如果可以更改,则THX
- 编码中是"utf-8"还是"utf8"。根据JavaSE对编码的引用,由于EDCOX1×0是一个EDCOX1×1的类,它将是"UTF8"。
- @nobleuplift:最安全的赌注是StandardCharsets.UTF_8,没有错误输入的可能;-)但是是的,如果你使用字符串"UTF8",是正确的(尽管我似乎记得它会接受两种方式)。
- 事实上,我认为Java接受"UTF-8"的大部分排列,有和没有破折号和上小写字母。
- @约阿希姆绍尔实际上,这是以东王的目的之一,还有……好。。建立字节顺序!因此,我觉得奇怪的是,Java的FieleRead不能自动检测具有这样一个BOM的UTF 16。事实上,我曾经写过一本《江户记》1(5),正是这样。不幸的是,封闭源代码,但谷歌有它的单码阅读器,这是非常相似的。
- @Stijndewitt:据我所知,字节顺序标记仅用于指示使用了哪种UTF-16变体(le或be),而不是区分UTF-16和其他编码。它也被用于UTF-8,但从未被正式标准化。总之,我不认为这是了解随机文件编码的可靠方法(如果您知道所有文件都是某种utf-16变体,那么继续使用它,否则我不想依赖它)。
- @joachimsauer这个bom被明确地用于建立字节顺序和作为签名标记的双重目的:"Q:当使用一个bom时,它是不是只有16位的unicode文本?答:不,无论Unicode文本如何转换,BOM都可以用作签名:utf-16、utf-8或utf-32。组成BOM的确切字节将是由该转换格式转换成的Unicode字符U+FEFF的任何字节。在这种形式中,bom既表示它是一个unicode文件,又表示它使用的是哪种格式。"unicode.org/faq/utf_bm.html
- @史蒂恩德维特:我接受纠正。主要的问题仍然存在:只有当所讨论的数据是utf-*并且有一个规范不要求的BOM(并且通常不存在)时,这才有帮助。
- @约阿希姆绍尔是的,非常真实。也许我们应该习惯于用BOM开始文本文件…问题是一些老的软件在它上面旅行。但是,如果它在那里,我们可以并且应该使用它。太糟糕了,FileReader无法应付。
EDCOX1(0)使用Java的平台默认编码,这取决于它正在运行的计算机的系统设置,并且通常是该区域中用户之间最流行的编码。
如果这个"最佳猜测"不正确,那么您必须显式地指定编码。不幸的是,FileReader不允许这样做(API中的主要监督)。相反,您必须使用new InputStreamReader(new FileInputStream(filePath), encoding),最好从文件的元数据中获取编码。
- "API中的主要监督"-感谢您的解释-我想知道为什么找不到我想要的构造函数!欢呼约翰
- @Bhanu Sharma:这是不同级别的编码问题,请检查从何处获取文件名,以及是否对编译器使用的编码进行了硬编码。
- 我同时使用文件名和硬编码作为字符串,但同样的问题是我应该做什么:(
- /storage/emulated/0/bhanuдосвиданиrel.txt:open failed:enent(无此类文件或目录)
- 请帮帮我,先生,我陷入了困境……请帮帮:(
- @Bhanusharma:文件名编码问题与此问题无关。请参阅许多现有的"为什么Unicode文件名不工作于Java"的问题之一。spoiler:java.io API(如filereader)使用C标准库文件系统调用,这在Windows上不支持Unicode;请考虑改用java.nio。
- "EDCOX1×0"使用Java的平台默认编码,这取决于它运行的计算机的系统设置,并且通常是该区域中用户之间最流行的编码。至少是窗户。由于一些奇怪的技术/历史原因,JVM忽略了这样一个事实,即Unicode是"所有新应用程序"在Windows上的推荐编码,而始终充当的是将旧应用程序配置为回退的旧编码是"平台默认值"。
- 我甚至会说,如果Java应用程序每次读取或写入文件/流/资源时没有明确地指定编码,那么它就被破坏了,因为它不能可靠地工作。
自Java 11以来,您可以使用: