0 0

如何显示出Unicode文件中的汉字5

我想把一个包含汉字Unicode编码的文件uni.txt用Java读取出来,并正确显示中文,请问该如何做呢。我使用FileInputStream和DataInputStream都没有读取成功。请大家指点一下。

uni.txt包含这样的内容:
table.rows.length; //\u8868\u683c\u603b\u884c\u6570
tableModel_arr[tib].pg.perPageCount; //\u6bcf\u9875\u8bb0\u5f55\u6570
tableModel_arr[tib].pg.page;//\u5f53\u524d\u7b2c\u51e0\u9875
。。。。。。

我单独用System.out.println("table.rows.length; //\u8868\u683c\u603b\u884c\u6570")能打印汉字;但一旦用输入流就不行了。
问题补充:
**************************************************************
感谢大家,面对大家的热情,如果我不说两句的话,我心里会憋得难受的。

以前我在其它网站提问题,不是很久没有回复,就是答非所问;在JavaEye我也是第一次提问,本是抱着试试的心里,没想到各位真是够哥们,有建议,也有代码,我都不晓得如何感激了。

祝各位前途似锦,祝JavaEye越办越火!
OO 
2008年6月24日 08:54

5个答案 按时间排序 按投票排序

0 0

采纳的答案

代码大概如下:

import java.io.*;

public class ReadTxtFile {
    public static void main(String[] s) throws IOException {
        new ReadTxtFile().readTxtFile("C://uni.txt");
    }

    private void readTxtFile(String fileName) throws IOException {
        File file = new File(fileName);
        FileInputStream fin = new FileInputStream(file);
        InputStreamReader read = new InputStreamReader(fin, "utf-8");
        BufferedReader reader = new BufferedReader(read);
        String content = reader.readLine();
        while (content != null) {
            char[] c = content.toCharArray();
            char[] out = new char[c.length];
            System.out.println(loadConvert(c, 0, c.length, out));
            content = reader.readLine();
        }
        read.close();
        reader.close();
        fin.close();
    }

    private String loadConvert(char[] in, int off, int len, char[] convtBuf) {
        if (convtBuf.length < len) {
            int newLen = len * 2;
            if (newLen < 0) {
                newLen = Integer.MAX_VALUE;
            }
            convtBuf = new char[newLen];
        }
        char aChar;
        char[] out = convtBuf;
        int outLen = 0;
        int end = off + len;

        while (off < end) {
            aChar = in[off++];
            if (aChar == '\\') {
                aChar = in[off++];
                if (aChar == 'u') {
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = in[off++];
                        switch (aChar) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed \\uxxxx encoding.");
                        }
                    }
                    out[outLen++] = (char) value;
                } else {
                    if (aChar == 't')
                        aChar = '\t';
                    else if (aChar == 'r')
                        aChar = '\r';
                    else if (aChar == 'n')
                        aChar = '\n';
                    else if (aChar == 'f')
                        aChar = '\f';
                    out[outLen++] = aChar;
                }
            } else {
                out[outLen++] = (char) aChar;
            }
        }
        return new String(out, 0, outLen);
    }
}

2008年6月24日 12:17
0 0

楼上的手快...

2008年6月24日 10:12
0 0

去看 Properties.loadConvert (char[] in, int off, int len, char[] convtBuf)方法. 实验后,可用.

String s = new String("\u4F60");
char[] c = s.toCharArray();			
char[] out = new char[c.length];		
System.out.println(new Tests().loadConvert(c, 0, c.length, out)); // 你


t.loadConvert就是直接拷贝的Properties.loadConvert 方法.

2008年6月24日 10:11
0 0

loadConvert作用是转换编码

2008年6月24日 10:07
0 0

参考java.util.Properties

	public synchronized void load(InputStream inStream,String encoding) throws IOException {
		char[] convtBuf = new char[1024];
		LineReader lr = new LineReader(inStream,encoding);

		int limit;
		int keyLen;
		int valueStart;
		char c;
		boolean hasSep;
		boolean precedingBackslash;

		while ((limit = lr.readLine()) >= 0) {

			c = 0;
			keyLen = 0;
			valueStart = limit;
			hasSep = false;

			// System.out.println("line=<" + new String(lineBuf, 0, limit) +
			// ">");
			precedingBackslash = false;
			while (keyLen < limit) {
				c = lr.lineBuf[keyLen];
				// need check if escaped.
				if ((c == '=' || c == ':') && !precedingBackslash) {
					valueStart = keyLen + 1;
					hasSep = true;
					break;
				} else if ((c == ' ' || c == '\t' || c == '\f')
						&& !precedingBackslash) {
					valueStart = keyLen + 1;
					break;
				}
				if (c == '\\') {
					precedingBackslash = !precedingBackslash;
				} else {
					precedingBackslash = false;
				}
				keyLen++;
			}
			while (valueStart < limit) {
				c = lr.lineBuf[valueStart];
				if (c != ' ' && c != '\t' && c != '\f') {
					if (!hasSep && (c == '=' || c == ':')) {
						hasSep = true;
					} else {
						break;
					}
				}
				valueStart++;
			}
			String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
			String value = loadConvert(lr.lineBuf, valueStart, limit
					- valueStart, convtBuf);
			put(key, value);
		}
		lr.reader.close();
	}

	/*
	 * read in a "logical line" from input stream, skip all comment and blank
	 * lines and filter out those leading whitespace characters (\u0020, \u0009
	 * and \u000c) from the beginning of a "natural line". Method returns the
	 * char length of the "logical line" and stores the line in "lineBuf".
	 */
	class LineReader {
		public LineReader(InputStream inStream,String encoding) {
			try {
				this.reader = new BufferedReader(new InputStreamReader(inStream,encoding));
			} catch (UnsupportedEncodingException e) {
//				Logger.getLogger(LineReader.class).error(e);
			}
		}

		char[] inBuf = new char[8192];
		char[] lineBuf = new char[1024];
		int inLimit = 0;
		int inOff = 0;
//		InputStream inStream;
		BufferedReader reader ;

		int readLine() throws IOException {
			int len = 0;
			char c = 0;

			boolean skipWhiteSpace = true;
			boolean isCommentLine = false;
			boolean isNewLine = true;
			boolean appendedLineBegin = false;
			boolean precedingBackslash = false;
			boolean skipLF = false;
			while (true) {
				if (inOff >= inLimit) {
					inLimit = reader.read(inBuf);
					inOff = 0;
					if (inLimit <= 0) {
						if (len == 0 || isCommentLine) {
							return -1;
						}
						return len;
					}
				}
				
				// The line below is equivalent to calling a
				// ISO8859-1 decoder.
//				c = (char) (0xff & inBuf[inOff++]);
				c = inBuf[inOff++];
				if (skipLF) {
					skipLF = false;
					if (c == '\n') {
						continue;
					}
				}
				if (skipWhiteSpace) {
					if (c == ' ' || c == '\t' || c == '\f') {
						continue;
					}
					if (!appendedLineBegin && (c == '\r' || c == '\n')) {
						continue;
					}
					skipWhiteSpace = false;
					appendedLineBegin = false;
				}
				if (isNewLine) {
					isNewLine = false;
					if (c == '#' || c == '!') {
						isCommentLine = true;
						continue;
					}
				}

				if (c != '\n' && c != '\r') {
					lineBuf[len++] = c;
					if (len == lineBuf.length) {
						int newLength = lineBuf.length * 2;
						if (newLength < 0) {
							newLength = Integer.MAX_VALUE;
						}
						char[] buf = new char[newLength];
						System.arraycopy(lineBuf, 0, buf, 0, lineBuf.length);
						lineBuf = buf;
					}
					// flip the preceding backslash flag
					if (c == '\\') {
						precedingBackslash = !precedingBackslash;
					} else {
						precedingBackslash = false;
					}
				} else {
					// reached EOL
					if (isCommentLine || len == 0) {
						isCommentLine = false;
						isNewLine = true;
						skipWhiteSpace = true;
						len = 0;
						continue;
					}
					if (inOff >= inLimit) {
						inLimit = reader.read(inBuf);
						inOff = 0;
						if (inLimit <= 0) {
							return len;
						}
					}
					if (precedingBackslash) {
						len -= 1;
						// skip the leading whitespace characters in following
						// line
						skipWhiteSpace = true;
						appendedLineBegin = true;
						precedingBackslash = false;
						if (c == '\r') {
							skipLF = true;
						}
					} else {
						return len;
					}
				}
			}
		}
//=================end of readLine()===========
	}

	/*
	 * Converts encoded &#92;uxxxx to unicode chars and changes special saved
	 * chars to their original forms
	 */
	private String loadConvert(char[] in, int off, int len, char[] convtBuf) {
		if (convtBuf.length < len) {
			int newLen = len * 2;
			if (newLen < 0) {
				newLen = Integer.MAX_VALUE;
			}
			convtBuf = new char[newLen];
		}
		char aChar;
		char[] out = convtBuf;
		int outLen = 0;
		int end = off + len;

		while (off < end) {
			aChar = in[off++];
			if (aChar == '\\') {
				aChar = in[off++];
				if (aChar == 'u') {
					// Read the xxxx
					int value = 0;
					for (int i = 0; i < 4; i++) {
						aChar = in[off++];
						switch (aChar) {
						case '0':
						case '1':
						case '2':
						case '3':
						case '4':
						case '5':
						case '6':
						case '7':
						case '8':
						case '9':
							value = (value << 4) + aChar - '0';
							break;
						case 'a':
						case 'b':
						case 'c':
						case 'd':
						case 'e':
						case 'f':
							value = (value << 4) + 10 + aChar - 'a';
							break;
						case 'A':
						case 'B':
						case 'C':
						case 'D':
						case 'E':
						case 'F':
							value = (value << 4) + 10 + aChar - 'A';
							break;
						default:
							throw new IllegalArgumentException(
									"Malformed \\uxxxx encoding.");
						}
					}
					out[outLen++] = (char) value;
				} else {
					if (aChar == 't')
						aChar = '\t';
					else if (aChar == 'r')
						aChar = '\r';
					else if (aChar == 'n')
						aChar = '\n';
					else if (aChar == 'f')
						aChar = '\f';
					out[outLen++] = aChar;
				}
			} else {
				out[outLen++] = (char) aChar;
			}
		}
		return new String(out, 0, outLen);
	}

2008年6月24日 10:05

相关推荐

    dfm文件Unicode汉字转换器

    从Delphi7开始,窗体文件dfm里的汉字都变成了#28162#31992之类的形式,看起来非常不直观。 而且在delphi2009,delphi2010里,...因此,做了一个转换器,可以将Unicode数字表示的汉字#28162#31992转换为正确显示的汉字。

    Unicode汉字编码表(全)

    Unicode汉字编码表是全球计算机系统中用于表示汉字的标准编码之一,它在中文信息处理领域扮演着至关重要的角色。Unicode,全称统一码或万国码,是一个为所有字符集提供唯一数字标识的国际标准,旨在解决不同语言字符...

    Notepad++(UNICODE)简体中文

    通过使用UNICODE,Notepad++能够正确地显示和保存包含中文字符的文件,这对于中文开发者来说非常关键。 Notepad++的特点包括: 1. **多文档界面**:用户可以同时打开和编辑多个文件,方便在不同的代码之间切换。 ...

    DFM文件UniCode汉字简繁体双向转换工具

    因此,做了一个转换器,可以将Unicode数字表示的汉字#28162#31992转换为正确显示的汉字。 也可以反向转换,即将含汉字的文件转换为#28382#33288之类的格式。 因客户的习惯要求,需要对工程做简繁体转换。 本工具可以...

    unicode文件的压缩包

    Unicode文件是一种广泛使用的字符编码标准,它旨在统一全球各种语言的字符表示,使得不同语言的文字能够在计算机中正确地存储和处理。在IT行业中,理解和掌握Unicode对于开发跨平台、多语言支持的应用程序至关重要。...

    vfp9 显示和输出 unicode 文本试验

    在这个实验中,表单可能包含用于显示Unicode文本的控件,比如LABEL或EDIT,开发者可能已经编写了代码来处理Unicode输入和显示。 `unicode.VCT` 和 `unicode.vcx` 可能是自定义控件或者类库文件,它们扩展了VFP的...

    unicode中文互转工具

    例如,当从Unicode编码的文件中读取数据时,可能会遇到显示乱码的情况,这时就可以用此工具进行转换。同时,对于处理多语言内容的软件开发者,此工具也有助于确保程序正确地显示和处理各种语言的字符。 综上所述,...

    vb读写Unicode文件的完美实例

    在VB(Visual Basic)编程中,处理Unicode文件是一项常见的任务,因为Unicode是一种广泛使用的字符编码标准,能够支持全球多种语言的字符。本实例主要讲解如何使用VB进行Unicode文件的读写操作,尤其关注二进制模式...

    unicode文件和中文文件互转程序加源码

    标题中的"unicode文件和中文文件互转程序加源码"指的是一个能够转换Unicode编码的文件与中文特定编码(如GB2312、GBK等)文件的程序。这个程序可能包含两部分:读取Unicode编码的文件并将其转换为中文编码,以及将...

    Unicode转中文 Unicode字符串 转中文编码

    “Unicode转中文”是指将Unicode编码的字符串转换为中文字符显示。在C#中,这通常是透明的,因为C#的String类内部使用UTF-16编码,而中文字符在UTF-16中可以直接表示。但如果你需要手动进行转换,可以使用`Encoding`...

    TXT电子书批量转换中文Unicode编码

    6. **检查结果**:转换完成后,检查新文件夹中的TXT文件,确认中文字符是否正常显示。 在使用这个工具时,需要注意的是,如果源文件已经使用Unicode编码,转换可能不会产生任何变化,或者可能导致文件元数据丢失。...

    中文汉字转unicode工具

    压缩包中的“中文汉字转unicode工具”很可能是这样一个实用的应用程序,提供了便捷的方式来处理和转换中文汉字到 Unicode 码点。使用这样的工具,无论是开发者还是普通用户,都能够更方便地理解和操作汉字在数字世界...

    unicode中简体中文编码

    本文将深入探讨“Unicode中简体中文编码”这一主题,以及它在实际应用中的意义和作用。 Unicode是一个国际标准,旨在为世界上所有字符提供一个统一的编码方案。它的目标是消除由于不同字符集(如ASCII、GB2312、Big...

    最全的unicode 汉字编码表

    根据提供的文件内容,我们了解到该文件包含了一段特殊的Unicode编码表示例,范围为`4e00-9fa5`,这部分是Unicode标准中用于表示常用汉字的部分。 ##### 字符范围解析 - **起始码位**:`4e00` - 表示该范围内的第...

    unicode码转中文

    在这个“unicode.txt”文件中,我们很可能看到的是以UTF-8或UTF-16编码的Unicode码点,这些码点需要转换为对应的中文字符才能被人类阅读。转换过程通常包括以下几个步骤: 1. **读取文件**:首先,我们需要读取...

    unicode点阵显示字库文件

    在给定的标题“unicode点阵显示字库文件”和描述“gbk点阵字库文件,unicode转换为gbk的文件”中,涉及到两个关键的字符编码标准:Unicode和GBK,以及点阵字库的概念。 1. Unicode: Unicode是一种国际标准,也称为...

    unicode至汉字的批量转换

    通过这个码点,我们可以将Unicode编码转换为汉字,以便在计算机系统中显示和处理。 批量转换Unicode码至汉字是一个常见的需求,特别是在处理大量文本数据时。在提供的描述中,提到了一个工具或者程序,用户可以输入...

    unicode-中文转换

    在Unicode编码体系中,中文字符通常占据两个或四个字节,这取决于具体的实现方式。 "unicode-cn.zip"这个压缩包文件似乎包含了一个名为"Unicode.exe"的应用程序,可能是用于进行Unicode编码和中文字符之间的转换...

    汉字UNICODE互换工具.exe

    汉字UNICODE互换工具就是为了解决这类问题而生的,它能将文本数据中的汉字从一种编码格式转换为另一种,例如将GBK编码的文本转换成UNICODE编码,以便在支持UNICODE的系统上正常显示。 使用这款工具,用户可以方便地...

    通用规范汉字UNICODE码表

    根据提供的部分内容,可以推断出文件中列出了一系列汉字及其对应的UNICODE编码。例如,开头列出了“人”、“千”、“川”等字,后面跟随的是它们对应的UNICODE编码值(如“人”对应“4EBA”)。通过这种方式,可以为...

Global site tag (gtag.js) - Google Analytics