`
zhaobohao
  • 浏览: 21305 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在java中,将utf-8字符码影射成汉字

    博客分类:
  • JAVA
阅读更多
以下是一个字符码转换的工具。
在此留个记号,只能运行在jdk1.6下。
utf16这个类在jre/lib/rt.jar下。
/*
 * (#)CharsetConvertor.java 1.0 2009-8-19  
 */
package com.codelib.util;

import java.io.UnsupportedEncodingException;
import java.lang.Character.UnicodeBlock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import sun.text.normalizer.UTF16;

/**
 * @author 赵博
 * @version $1.0, 2009-8-19
 * @since JDK6
 */
public class CharsetConvertor
{
	public static void main(String[] args)
	{

		try
		{
			String s = "中国人";
			System.out.println(s);
			System.out.println(s.getBytes().length);
			String fullByte = CharsetConvertor.utf8ToUnicode(s);
			System.out.println(fullByte);
			System.out.println(CharsetConvertor.Unicode2GBK(fullByte));
			System.out.println(CharsetConvertor.Unicode2GBK(fullByte).getBytes("gbk").length);
			 
			// String fullStr = new String( fullByte.getBytes(), "UTF-8");
			// System.out.println("string from GBK to UTF-8 byte:  " + fullStr);

		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * @param chinese
	 * @return
	 */
	public static byte[] gbk2utf8(String chinese)
	{
		char c[] = chinese.toCharArray();
		byte[] fullByte = new byte[3 * c.length];
		for (int i = 0; i < c.length; i++)
		{
			int m = (int) c[i];
			String word = Integer.toBinaryString(m);
			// System.out.println(word);

			StringBuffer sb = new StringBuffer();
			int len = 16 - word.length();
			// 锟斤拷锟斤拷
			for (int j = 0; j < len; j++)
			{
				sb.append("0");
			}
			sb.append(word);
			sb.insert(0, "1110");
			sb.insert(8, "10");
			sb.insert(16, "10");

			// System.out.println(sb.toString());

			String s1 = sb.substring(0, 8);
			String s2 = sb.substring(8, 16);
			String s3 = sb.substring(16);

			byte b0 = Integer.valueOf(s1, 2).byteValue();
			byte b1 = Integer.valueOf(s2, 2).byteValue();
			byte b2 = Integer.valueOf(s3, 2).byteValue();
			byte[] bf = new byte[3];
			bf[0] = b0;
			fullByte[i * 3] = bf[0];
			bf[1] = b1;
			fullByte[i * 3 + 1] = bf[1];
			bf[2] = b2;
			fullByte[i * 3 + 2] = bf[2];

		}
		return fullByte;
	}

	/**
	 * utf-8 转换�?unicode
	 * 
	 * @author fanhui 2007-3-15
	 * @param inStr
	 * @return
	 */
	public static String utf8ToUnicode(String inStr)
	{
		char[] myBuffer = inStr.toCharArray();

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < inStr.length(); i++)
		{
			UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]);
			if (ub == UnicodeBlock.BASIC_LATIN)
			{
				// 英文及数字等
				sb.append(myBuffer[i]);
			}
			else if (ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS)
			{
				// 全角半角字符
				int j = (int) myBuffer[i] - 65248;
				sb.append((char) j);
			}
			else
			{
				// 汉字
				short s = (short) myBuffer[i];
				String hexS = Integer.toHexString(s);
				String unicode = "\\u" + hexS;
				sb.append(unicode.toLowerCase());
			}
		}
		return sb.toString();
	}

	/**
	 * unicode 转换�?utf-8
	 * 
	 * @author fanhui 2007-3-15
	 * @param theString
	 * @return
	 */
	public static String unicodeToUtf8(String theString)
	{
		char aChar;
		int len = theString.length();
		StringBuffer outBuffer = new StringBuffer(len);
		for (int x = 0; x < len;)
		{
			aChar = theString.charAt(x++);
			if (aChar == '\\')
			{
				aChar = theString.charAt(x++);
				if (aChar == 'u')
				{
					// Read the xxxx
					int value = 0;
					for (int i = 0; i < 4; i++)
					{
						aChar = theString.charAt(x++);
						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   <a><font color=#4563b9>\\uxxxx</font></a>   encoding.");
						}
					}
					outBuffer.append((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';
					outBuffer.append(aChar);
				}
			}
			else
				outBuffer.append(aChar);
		}
		return outBuffer.toString();
	}

	/**
	 * 中文转unicode
	 * 
	 * @param str
	 * @return 反回unicode编码
	 */

	public static String GBK2Unicode(String str)
	{

		StringBuffer result = new StringBuffer();

		for (int i = 0; i < str.length(); i++)
		{

			char chr1 = (char) str.charAt(i);

			if (!CharsetConvertor.isNeedConvert(chr1))
			{

				result.append(chr1);

				continue;

			}

			result.append("\\u" + Integer.toHexString((int) chr1));

		}

		return result.toString();

	}

	/**
	 * unicode转中�?
	 * 
	 * @param str
	 * @return 中文
	 */

	public static String Unicode2GBK(String dataStr)
	{

		int index = 0;

		StringBuffer buffer = new StringBuffer();

		while (index < dataStr.length())
		{

			if (!"\\u".equals(dataStr.substring(index, index + 2)))
			{

				buffer.append(dataStr.charAt(index));

				index++;

				continue;

			}

			String charStr = "";

			charStr = dataStr.substring(index + 2, index + 6);
			char letter = (char) Integer.parseInt(charStr, 16);
			try
			{
				System.out.println("byte length="+(letter+"").getBytes("gbk").length);
				buffer.append(new String((letter+"").getBytes("gbk"),"gbk"));
			}
			catch (UnsupportedEncodingException e)
			{
				e.printStackTrace();
			}

			index += 6;

		}

		return buffer.toString();

	}

	public static boolean isNeedConvert(char para)
	{

		return ((para & (0x00FF)) != para);

	}
	/**
	 * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
	 * 
	 * @param s
	 *            原文件名
	 * @return 重新编码后的文件名
	 * @author yue
	 */
	public static String toUtf8String(String s)
	{
		if (s == null || s.equals(""))
		{
			return null;
		}
		StringBuffer sb = new StringBuffer();
		try
		{
			char c;
			for (int i = 0; i < s.length(); i++)
			{
				c = s.charAt(i);
				if (c >= 0 && c <= 255)
				{
					sb.append(c);
				}
				else
				{
					byte[] b;

					b = Character.toString(c).getBytes("utf-8");

					for (int j = 0; j < b.length; j++)
					{
						int k = b[j];
						if (k < 0)
							k += 256;
						sb.append("%" + Integer.toHexString(k).toUpperCase());
					}
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return sb.toString();
	}

	/**
	 * 将10进制的utf-8字符码,映射成为汉字。
	 * 
	 * @param code
	 * @return
	 */
	public static String utf8decode(String code)
	{
		Pattern regex = Pattern.compile("&#\\d{5};");
		Matcher matcher = regex.matcher(code);
		int index = 0;
		while (matcher.find())
		{
			code = code.replaceAll(matcher.group(index), UTF16.valueOf(Integer.parseInt(matcher.group(index).replaceAll("[#&;]", ""))));

		}

		return code;
	}
}



如果有同学有更好的方法,请在此留下你的脚印。
0
0
分享到:
评论

相关推荐

    UTF-8汉字码表.txt

    在给定文件“UTF-8汉字码表.txt”的描述中提到的“utf-8中文汉字编码表”,主要关注的是如何用UTF-8编码来表示中文汉字。 #### 二、文件内容分析 文件中展示了一些具体的编码示例,从十六进制数字`20`到`7E`以及从...

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    在Java中,避免UTF-8的csv文件打开中文出现乱码的方法是非常重要的。csv文件是 comma separated values 的缩写,常用于数据交换和导入导出操作。然而,在Java中读取和写入csv文件时,中文字符如果不正确地处理,可能...

    UTF-8 汉字码表

    这意味着,对于ASCII码范围内的字符(即从0到127的字符),在UTF-8中它们仍然只占用一个字节,且二进制表示与ASCII相同。这种兼容性使得UTF-8能够在继承ASCII优点的同时,拓展对全球各种语言的支持。 #### 汉字在...

    UTF-8字符集汉字对照表.txt

    此文本文档是UTF-8字符集中汉字编码对照表,可以用于查看某个汉字在UTF-8编码集中的位置。此编码集对照表非官网下载,如需使用,请提前预估风险。另外,此对照表只用于学习研究,如需用到其他地方,后果自负。

    Java解决UTF-8的BOM问题

    在Java编程中,UTF-8编码是一个非常常见且广泛使用的字符编码格式,它能支持全球大部分语言的字符表示。然而,UTF-8有一个特殊特性,那就是它可以带有Byte Order Mark(BOM),这是一个特殊的字节序列,用于标识数据...

    java 编码 UTF-8、ISO-8859-1、GBK

    例如,如果数据库是UTF-8,JSP是GBK,可以使用 `new String(rs.getBytes(1),"UTF-8")` 将数据库中的UTF-8字节流转换为GBK字符串。反之,如果JSP是UTF-8,数据库是GBK,需要先将GBK字符串转换为字节流,然后再次转换...

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    本文将深入探讨如何在C++中处理UTF-8字符串,并介绍相关的关键概念和技术。 首先,C++标准库并没有直接支持UTF-8编码的内置类型,但是我们可以通过`std::string`类来间接地操作UTF-8字符串。`std::string`通常用来...

    java jsp解决utf-8乱码.zip

    在Java JSP开发中,遇到UTF-8编码导致的乱码问题是一个常见的困扰。这个问题主要涉及到字符编码的统一和正确处理。UTF-8是一种广泛使用的Unicode字符编码方案,它可以支持几乎所有的字符集,包括中文、日文和韩文。...

    source insight 3.5 UTF-8中文乱码插件_sourceinsight3.5_utf-8_插件补丁_中文乱码_

    总的来说,"source insight 3.5 UTF-8中文乱码插件"是解决Source Insight 3.5与UTF-8编码不兼容问题的有效工具,通过正确安装和应用此插件,开发者可以更顺畅地在Source Insight环境中阅读和编辑包含中文字符的代码...

    常用汉字utf-8字符集.txt

    ### 常用汉字UTF-8字符集解析与应用 #### 概述 在数字信息时代,字符编码是数据处理的基础。UTF-8(8位通用转换格式)是一种可变长度的字符编码,用于表示Unicode标准中的字符。《常用汉字utf-8字符集》主要收集了...

    UTF-8 中文字符集表

    UTF-8 中文 字符集表 免费share UTF-8 ---&gt; Chinese Charset Table

    UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_

    在LabVIEW编程环境中,"UTF-8toGBK.vi"这个程序可能是一个用户自定义的VI(Virtual Instrument),用于将UTF-8编码的字符串转换为GBK编码。LabVIEW作为一个图形化编程语言,提供了丰富的字符串处理函数,其中包括了...

    易语言判断UTF-8字符源码

    2. 编码转换:如果需要将其他编码格式的字符串转换成UTF-8,易语言提供了“转换编码”命令,可以实现GBK、BIG5等编码与UTF-8之间的转换。 3. 字节序列分析:判断一个字符串是否为UTF-8,需要检查每个字节的最高位。...

    UCS-2转换为utf-8代码

    这个过程可以使用 UCS2toUTF8Code 函数实现,该函数将 UCS-2 字符转换为 UTF-8 字符,并将结果存储在 TmpUtf8 数组中。 UCS-2 转换为 UTF-8 的步骤 1.首先,需要将输入字符串转换为 UCS-2 字符数组,使用 StrToUCS...

    快速转码(UTF-8转ASCII)

    在上述代码中,我们首先获取了UTF-8和ASCII的`Charset`对象,然后创建了一个UTF-8编码器,并将UTF-8字符串编码为字节数组。由于ASCII只能表示128个字符,所以在转换过程中可能会遇到无法表示的字符,这时我们需要...

    中文字符 UTF-8 编码查询表

    为大家提供Python的UTF-8编码查询表,大家可以对照左列的编码查询右列的汉字。 例:\u4e00对应汉字“一”

    ASCII 及UTF-8 与字符互相转换

    ASCII 和 UTF-8 是两种广泛使用的字符编码标准,它们在计算机科学中扮演着重要的角色,尤其是在文本处理和数据传输方面。这两个编码系统都是为了将人类可读的字符转化为计算机可以理解的形式,但它们的设计和使用...

    utf-8 中文字符表

    "UTF-8中文字符表"这个文件很可能包含了UTF-8编码的所有中文字符,从基本汉字到繁体字,甚至包括一些罕见的古汉字和符号。开发者可以参考这个表格来检查特定的中文字符在UTF-8编码下的表示,这对于调试和处理中文...

    gb2312,utf-8,utf-8-bom等编码格式的互相转换

    本文将深入探讨几种常见的编码格式,如GB2312、UTF-8以及UTF-8-BOM,并详细讲解如何在C#中进行这些编码格式之间的转换,同时会涉及到与Stream相关的操作。 GB2312,全称为“国标汉字编码字符集”,是中国大陆广泛...

Global site tag (gtag.js) - Google Analytics