SoivSvipad怎么读读?

24194人阅读
&Java读取UTF-8的txt文件第一行出现乱码&?&及解决
test.txt文件内容:A中2国3456
test.txt文件采用写字板保存为UTF-8格式保存并关闭后使用写字板再次打开该UTF-8文档,中文、字母正常显示
测试代码:
import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.InputStreamR
public class ReadTxtFile {
public static void main(String[] args) {
String charsetName = "UTF-8";
String path = "D:/to_delete/test.txt";
File file = new File(path);
if (file.isFile() && file.exists())
InputStreamReader insReader = new InputStreamReader(
new FileInputStream(file), charsetName);
BufferedReader bufReader = new BufferedReader(insReader);
String line = new String();
while ((line = bufReader.readLine()) != null) {
System.out.println(line);
bufReader.close();
insReader.close();
} catch (Exception e) {
System.out.println("读取文件内容操作出错");
e.printStackTrace();
程序执行结果:?A中2国3456
我的解决办法:
使用UltraEdit将上边的txt文件另存为UTF-8无BOM格式;
使用Notepad++打开上边的txt文件执行如下操作&格式--&以UTF-8无BOM格式编码&,修改后将txt文本进行保存。
网上有篇非常好的文章,论述了问题出现的原因及解决办法
关键字: java 读utf-8, java写utf-8, 编码, utf-8 乱码
最近在处理文件时发现了同样类型的文件使用的编码可能是不同的。所以想将文件的格式统一一下(因为UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:如何查看现有文件的编码方式。 上网找了一下,找到几篇比较好文章,这里就不转载啦把链接搞过来。
上面的几篇文章可以看成认识编码问题的&从入门到精通& 如果你看完了上面的文章,一定了解到了,在java中,class文件采用utf8的编码方式,JVM运行时采用utf16。Java的字符串是永远都是unicode的,采用的是UTF-16的编码方式。 想测试一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符。 测试代码如下:
import&java.io.BufferedR &&
import&java.io.F &&
import&java.io.FileInputS &&
import&java.io.IOE &&
import&java.io.InputStreamR &&
public&class&UTF8Test&{ &&
&&&&public&static&void&main(String[]&args)&throws&IOException&{ &&
&&&&&&&&File&f&&=&new&File("./utf.txt"); &&
&&&&&&&&FileInputStream&in&=&new&FileInputStream(f); &&
&&&&&&&&&&
&&&&&&&&BufferedReader&br&=&new&BufferedReader(new&InputStreamReader(in,&"UTF-8")); &&
&&&&&&&& &&
&&&&&&&&String&line&=&br.readLine(); &&
&&&&&&&&while(line&!=&null) &&
&&&&&&&&{ &&
&&&&&&&&&&&&System.out.println(line); &&
&&&&&&&&&&&&line&=&br.readLine(); &&
&&&&&&&&} &&
import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.InputStreamR
public class UTF8Test {
public static void main(String[] args) throws IOException {
= new File("./utf.txt");
FileInputStream in = new FileInputStream(f);
// 指定读取文件时以UTF-8的格式读取
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line = br.readLine();
while(line != null)
System.out.println(line);
line = br.readLine();
utf.txt通过记事本创建,另存时使用指定utf-8编码,其内容为:
This is the first line. This is second line.
正常的测试结果应该是直接输出utf.txt的文本内容。可是实际上却输出了下面的内容:
?This is the first line. This is second line.
第一行多出了一个问号。 通过上面的几篇文章应该可以想到是Java读取BOM(Byte Order Mark)的问题,在使用UTF-8时,可以在文件的开始使用3个字节的"EF BB BF"来标识文件使用了UTF-8的编码,当然也可以不用这个3个字节。 上面的问题应该就是因为对开头3个字节的读取导致的。开始不太相信这个是JDK的Bug,后来在多次试验后,问题依然存在,就又狗狗了一下,果然找到一个如下的Bug:
不过在我关掉的一些页面中记得有篇文件说这个bug只在jdk1.5及之前的版本才有,说是1.6已经解决了,从目前来看1.6只是解决了读取带有BOM文件失败的问题,还是不能区别处理有BOM和无BOM的UTF-8编码的文件,从Bug ID:4508058里的描述可以看出,这个问题将作为一个不会修改的问题关闭,对于BOM编码的识别将由应用程序自己来处理,原因可从另处一个bug处查看到,因为Unicode对于BOM的编码的规定可能发生变化。也就是说对于一个UTF-8的文件,应用程序需要知道这个文件有没有写BOM,然后自己决定处理BOM的方式。 在上面的while循环中可加入下面的代码,测试一下读出内容:
byte[]&allbytes&=&line.getBytes("UTF-8");& &&
&&&&&&&&&&&&for&(int&i=0;&i&&&allbytes.&i++) &&
&&&&&&&&&&&&{ &&
&&&&&&&&&&&&&&&&int&tmp&=&allbytes[i]; &&
&&&&&&&&&&&&&&&&String&hexString&=&Integer.toHexString(tmp); &&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&hexString&=&hexString.substring(hexString.length()&-2); &&
&&&&&&&&&&&&&&&&System.out.print(hexString.toUpperCase()); &&
&&&&&&&&&&&&&&&&System.out.print("&"); &&
&&&&&&&&&&&&}&&
byte[] allbytes = line.getBytes("UTF-8");
for (int i=0; i & allbytes. i++)
int tmp = allbytes[i];
String hexString = Integer.toHexString(tmp);
// 1个byte变成16进制的,只需要2位就可以表示了,取后面两位,去掉前面的符号填充
hexString = hexString.substring(hexString.length() -2);
System.out.print(hexString.toUpperCase());
System.out.print(" ");
输出结果如下:
EF BB BF 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6C 69 6E 65 2E ?This is the first line. 54 68 69 73 20 69 73 20 73 65 63 6F 6E 64 20 6C 69 6E 65 2E This is second line.
红色部分的"EF BB BF"刚好是UTF-8文件的BOM编码,可以看出Java在读文件时没能正确处理UTF-8文件的BOM编码,将前3个字节当作文本内容来处理了。 使用链接中提供的代码可以解决碰到的乱码问题:
修改测试代码中的输入流后:
BufferedReader&br&=&new&BufferedReader(new&UnicodeReader(in,&Charset.defaultCharset().name()));&&
BufferedReader br = new BufferedReader(new UnicodeReader(in, Charset.defaultCharset().name()));
执行,可以看到正确的结果。 将用到的测试代码及UTF-8读取乱码解决(http://koti.mbnet.fi/akini/java/unicodereader)的源码放在了附件中
下载次数: 411
压缩包中的源代码
UnicodeInputStream.java
version: 1.1 /
- changed BOM recognition ordering (longer boms first)
Original pseudocode
: Thomas Weidenfeller
Implementation tweaked: Aki Nieminen
http://www.unicode.org/unicode/faq/utf_bom.html
BOMs in byte length ordering:
00 00 FE FF
= UTF-32, big-endian
FF FE 00 00
= UTF-32, little-endian
= UTF-16, big-endian
= UTF-16, little-endian
Win2k Notepad:
Unicode format = UTF-16LE
import java.io.*;
* This inputstream will recognize unicode BOM marks and will skip bytes if
* getEncoding() method is called before any of the read(...) methods.
* Usage pattern: String enc = "ISO-8859-1"; // or NULL to use systemdefault
* FileInputStream fis = new FileInputStream(file); UnicodeInputStream uin = new
* UnicodeInputStream(fis, enc); enc = uin.getEncoding(); // check and skip
* possible BOM bytes InputStreamR if (enc == null) in = new
* InputStreamReader(uin); else in = new InputStreamReader(uin, enc);
public class UnicodeInputStream extends InputStream {
PushbackInputStream internalIn;
boolean isInited =
String defaultE
private static final int BOM_SIZE = 4;
UnicodeInputStream(InputStream in, String defaultEnc) {
internalIn = new PushbackInputStream(in, BOM_SIZE);
this.defaultEnc = defaultE
public String getDefaultEncoding() {
return defaultE
public String getEncoding() {
if (!isInited) {
} catch (IOException ex) {
IllegalStateException ise = new IllegalStateException(
"Init method failed.");
ise.initCause(ise);
* Read-ahead four bytes and check for BOM marks. Extra bytes are unread
* back to the stream, only BOM bytes are skipped.
protected void init() throws IOException {
if (isInited)
byte bom[] = new byte[BOM_SIZE];
n = internalIn.read(bom, 0, bom.length);
if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00)
&& (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
encoding = "UTF-32BE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)
&& (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
encoding = "UTF-32LE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB)
&& (bom[2] == (byte) 0xBF)) {
encoding = "UTF-8";
unread = n - 3;
} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
encoding = "UTF-16BE";
unread = n - 2;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
encoding = "UTF-16LE";
unread = n - 2;
// Unicode BOM mark not found, unread all bytes
encoding = defaultE
// System.out.println("read=" + n + ", unread=" + unread);
if (unread & 0)
internalIn.unread(bom, (n - unread), unread);
isInited =
public void close() throws IOException {
// init();
isInited =
internalIn.close();
public int read() throws IOException {
// init();
isInited =
return internalIn.read();
UnicodeReader.java
version: 1.1 /
- changed BOM recognition ordering (longer boms first)
Original pseudocode
: Thomas Weidenfeller
Implementation tweaked: Aki Nieminen
http://www.unicode.org/unicode/faq/utf_bom.html
00 00 FE FF
= UTF-32, big-endian
FF FE 00 00
= UTF-32, little-endian
= UTF-16, big-endian
= UTF-16, little-endian
Win2k Notepad:
Unicode format = UTF-16LE
import java.io.*;
* Generic unicode textreader, which will use BOM mark to identify the encoding
* to be used. If BOM is not found then use a given default or system encoding.
public class UnicodeReader extends Reader {
PushbackInputStream internalIn;
InputStreamReader internalIn2 =
String defaultE
private static final int BOM_SIZE = 4;
* @param in
inputstream to be read
* @param defaultEnc
default encoding if stream does not have BOM marker. Give NULL
to use system-level default.
UnicodeReader(InputStream in, String defaultEnc) {
internalIn = new PushbackInputStream(in, BOM_SIZE);
this.defaultEnc = defaultE
public String getDefaultEncoding() {
return defaultE
* Get stream encoding or NULL if stream is uninitialized. Call init() or
* read() method to initialize it.
public String getEncoding() {
if (internalIn2 == null)
return internalIn2.getEncoding();
* Read-ahead four bytes and check for BOM marks. Extra bytes are unread
* back to the stream, only BOM bytes are skipped.
protected void init() throws IOException {
if (internalIn2 != null)
byte bom[] = new byte[BOM_SIZE];
n = internalIn.read(bom, 0, bom.length);
if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00)
&& (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
encoding = "UTF-32BE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)
&& (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
encoding = "UTF-32LE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB)
&& (bom[2] == (byte) 0xBF)) {
encoding = "UTF-8";
unread = n - 3;
} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
encoding = "UTF-16BE";
unread = n - 2;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
encoding = "UTF-16LE";
unread = n - 2;
// Unicode BOM mark not found, unread all bytes
encoding = defaultE
// System.out.println("read=" + n + ", unread=" + unread);
if (unread & 0)
internalIn.unread(bom, (n - unread), unread);
// Use given encoding
if (encoding == null) {
internalIn2 = new InputStreamReader(internalIn);
internalIn2 = new InputStreamReader(internalIn, encoding);
public void close() throws IOException {
internalIn2.close();
public int read(char[] cbuf, int off, int len) throws IOException {
return internalIn2.read(cbuf, off, len);
UTF8Test.java
&import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.InputStreamR
import java.nio.charset.C
public class UTF8Test {
public static void main(String[] args) throws IOException {
= new File("./utf.txt");
FileInputStream in = new FileInputStream(f);
// 指定读取文件时以UTF-8的格式读取
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
BufferedReader br = new BufferedReader(new UnicodeReader(in, Charset.defaultCharset().name()));
String line = br.readLine();
while(line != null)
System.out.println(line);
line = br.readLine();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:551364次
积分:6048
积分:6048
排名:第1327名
原创:69篇
转载:321篇
评论:87条
(6)(1)(5)(3)(2)(4)(24)(24)(8)(1)(3)(5)(2)(1)(8)(3)(3)(1)(9)(16)(11)(3)(1)(1)(1)(1)(1)(1)(5)(1)(2)(20)(19)(2)(7)(19)(8)(8)(25)(24)(29)(8)(1)(6)(1)(1)(26)(10)(1)(12)(7)请问ζ,η,γ,ξ,ψ,τ,ε,ρ,ν,μ;这些希腊字母怎么读?用汉语标音,谢谢了_百度知道
请问ζ,η,γ,ξ,ψ,τ,ε,ρ,ν,μ;这些希腊字母怎么读?用汉语标音,谢谢了
请问ζηγξψτερνμ;些希腊字母读用汉语标音谢谢
提问者采纳
希腊字母 英照览表 写 写 文名 英文注音 意义 A α 阿尔 Alpha 角度;系数 B β 贝塔 Beta 磁通系数;角度;系数 Γ γ 伽玛 Gamma 电导系数(写) Δ δ 德尔塔 Delta 变;密度;屈光度 Ε ε 伊普西隆 Epsilon 数基数 Ζ ζ 泽塔 Zeta 系数;位角;阻抗;相粘度;原序数 Η η 伊塔 Eta 磁滞系数;效率(写) Θ θ 西塔 Theta 温度;相位角 Ι ι 约塔 Iota 微点 Κ κ 卡帕 Kappa 介质数 ∧ λ 兰姆达 Lambada 波(写);体积 Μ μ 米欧 Mu 磁导系数;微(千);放数(写) Ν ν 纽 Nu 磁阻系数 Ξ ξ 克西 Xi Ο ο 欧米克隆 Omicron ∏ π 派 Pi 圆周率=圆周÷直径=3.1416 Ρ ρ 柔 Rho 电阻系数(写) ∑ σ 西格玛 Sigma 总(写)表面密度;跨导(写) Τ τ 陶 Tau 间数 Υ υ 玉普西隆 Upsilon 位移 Φ φ 弗 Phi 磁通; 角 Χ χ 凯 Chi Ψ ψ 普赛 Psi 角速;介质电通量(静电力线)
其他类似问题
按默认排序
其他5条回答
希腊字母 英照览表 写 写 文名 英文注音 意义 A α 阿尔 Alpha 角度;系数 B β 贝塔 Beta 磁通系数;角度;系数 Γ γ 伽玛 Gamma 电导系数(写) Δ δ 德尔塔 Delta 变;密度;屈光度 Ε ε 伊普西隆 Epsilon 数基数 Ζ ζ 泽塔 Zeta 系数;位角;阻抗;相粘度;原序数 Η η 伊塔 Eta 磁滞系数;效率(写) Θ θ 西塔 Theta 温度;相位角 Ι ι 约塔 Iota 微点 Κ κ 卡帕 Kappa 介质数 ∧ λ 兰姆达 Lambada 波(写);体积 Μ μ 米欧 Mu 磁导系数;微(千);放数(写) Ν ν 纽 Nu 磁阻系数 Ξ ξ 克西 Xi Ο ο 欧米克隆 Omicron ∏ π 派 Pi 圆周率=圆周÷直径=3.1416 Ρ ρ 柔 Rho 电阻系数(写) ∑ σ 西格玛 Sigma 总(写)表面密度;跨导(写) Τ τ 陶 Tau 间数 Υ υ 玉普西隆 Upsilon 位移 Φ φ 弗 Phi 磁通; 角 Χ χ 凯 Chi Ψ ψ 普赛 Psi 角速;介质电通量(静电力线);角 Ω ω 奥米伽 Omega 欧姆(写);角速(写);角
实际上你说的这些是希腊字母,多用在物理学中表示物理量,有些也有用于化学的序号 大写 小写 英文注音 国际音标注音 中文注音 1
伊普西龙 6
奥密克戎 16
宇普西龙 21
希腊字母只有24个!!!
希腊字母 中英对照一览表 大写 小写 中文名 英文注音 意义 A α 阿尔法 Alpha 角度;系数 B β 贝塔 Beta 磁通系数;角度;系数 Γ γ 伽玛 Gamma 电导系数(小写) Δ δ 德尔塔 Delta 变动;密度;屈光度 Ε ε 伊普西隆 Epsilon 对数之基数 Ζ ζ 泽塔 Zeta 系数;方位角;阻抗;相对粘度;原子序数 Η η 伊塔 Eta 磁滞系数;效率(小写) Θ θ 西塔 Theta 温度;相位角 Ι ι 约塔 Iota 微小,一点儿 Κ κ 卡帕 Kappa 介质常数 ∧ λ 兰姆达 Lambada 波长(小写);体积 Μ μ 米欧 Mu 磁导系数;微(千分之一);放大因数(小写) Ν ν 纽 Nu 磁阻系数 Ξ ξ 克西 Xi Ο ο 欧米克隆 Omicron ∏ π 派 Pi 圆周率=圆周÷直径=3.1416 Ρ ρ 柔 Rho 电阻系数(小写) ∑ σ 西格玛 Sigma 总和(大写),表面密度;跨导(小写) Τ τ 陶 Tau 时间常数 Υ υ 玉普西隆 Upsilon 位移 Φ φ 弗爱 Phi 磁通; 角 Χ χ 凯 Chi Ψ ψ 普赛 Psi 角速;介质电通量(静电力线)
伊普西龙 6
奥密克戎 16
宇普西龙 21
希腊字母的相关知识
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁无法找到该页
无法找到该页
您正在搜索的页面可能已经删除、更名或暂时不可用。
请尝试以下操作:
确保浏览器的地址栏中显示的网站地址的拼写和格式正确无误。
如果通过单击链接而到达了该网页,请与网站管理员联系,通知他们该链接的格式不正确。
单击按钮尝试另一个链接。
HTTP 错误 404 - 文件或目录未找到。Internet 信息服务 (IIS)
技术信息(为技术支持人员提供)
转到 并搜索包括&HTTP&和&404&的标题。
打开&IIS 帮助&(可在 IIS 管理器 (inetmgr) 中访问),然后搜索标题为&网站设置&、&常规管理任务&和&关于自定义错误消息&的主题。

我要回帖

更多关于 ipad怎么读 的文章

 

随机推荐