`

生僻字与16进制的转换

阅读更多

字符串中的生僻字在传输和存储的过程中存在着各种各样的问题,为了便于传输和存储,我们通常会把这些生僻字转换为16进制编码进行传输和存储。

package com.dc.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

/* ******************  类说明  *********************
 * class       :  RareWordUtil
 * @author     :  ncc
 * create time :  2017-12-20 上午09:49:54
 * @version    :  1.0  
 * description :  生僻字与16进制编码相互转化
 * @see        :                        
 * ************************************************/
public class RareWordUtil {
	private static Map<String, String> nameToValue;

	private static Map<String, String> valueToName;

	private String fileName = "gbk.txt";

	private String fileEncoding = "GBK";

	private final String preFix = "■△";

	private static final RareWordUtil cr_instance = new RareWordUtil();

	/**
	 * 构造方法
	 */
	private RareWordUtil() {
		try {
			init();
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

	/* ********************************************
	 * method name   : getInstance 
	 * description   : 获取实例
	 * @return       : RareWordUtil
	 * @param        : @return
	 * modified      : ncc ,  2017-12-20
	 * @see          : 
	 * ********************************************/      
	public static RareWordUtil getInstance() {
		return cr_instance;
	}

	/* ********************************************
	 * method name   : init 
	 * description   : 初始化
	 * @return       : void
	 * @param        : @throws IOException
	 * modified      : ncc ,  2017-12-20
	 * @see          : 
	 * ********************************************/      
	@SuppressWarnings( { "static-access", "unchecked" })
	private void init() throws IOException {
		if (nameToValue != null && valueToName != null) {
			return;
		}
		InputStream input = RareWordUtil.class.getResourceAsStream(fileName);
		InputStreamReader inputsr = new InputStreamReader(input, Charset.forName(fileEncoding));
		BufferedReader br = new BufferedReader(inputsr);

		this.nameToValue = new HashMap();
		this.valueToName = new HashMap();
		String line = null;
		while ((line = br.readLine()) != null) {
			String ret = new String(line.getBytes(fileEncoding), fileEncoding);
			String key = ret.substring(0, 1);
			String value = ret.substring(line.length() - 4, line.length());
			this.nameToValue.put(key, value);
			this.valueToName.put(value, key);
		}
	}

	/* ********************************************
	 * method name   : getRareWord 
	 * description   : 将含16进制编码的字符串转化成含生僻字的字符串
	 * @return       : String
	 * @param        : @param value
	 * @param        : @return
	 * modified      : ncc ,  2017-12-20
	 * @see          : 
	 * ********************************************/      
	@SuppressWarnings("static-access")
	public String getRareWord(String value) {
		StringBuffer sb = new StringBuffer();
		int pos = -1;
		while ((pos = value.indexOf(preFix)) != -1) {
			sb.append(value.substring(0, pos));
			String code = value.substring(pos + preFix.length(), pos + preFix.length() + 4);
			String codeValue = this.valueToName.get(code);
			sb.append(codeValue);
			value = value.substring(pos + preFix.length() + 4, value.length());
		}
		sb.append(value);
		return sb.toString();
	}

	/* ********************************************
	 * method name   : getHex 
	 * description   : 将含生僻字的字符串转化成含16进制编码的字符串
	 * @return       : String
	 * @param        : @param name
	 * @param        : @return
	 * modified      : ncc ,  2017-12-20
	 * @see          : 
	 * ********************************************/      
	@SuppressWarnings("static-access")
	public String getHex(String name) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < name.length(); i++) {
			String value = this.nameToValue.get(name.substring(i, i + 1));
			if (value == null) {
				sb.append(name.substring(i, i + 1));
			} else {
				sb.append(preFix + value);
			}
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		RareWordUtil cu = RareWordUtil.getInstance();
		String name = "王喆昊";
		name = cu.getHex(name);
		System.out.println("Cent2Dollar(1) = " + name);
		name = cu.getRareWord(name);
		System.out.println("Cent2Dollar(1) = " + name);

	}
}

 

 代码中用的的txt文件见附件。

  • gbk.rar (90.8 KB)
  • 下载次数: 1
分享到:
评论

相关推荐

    C#16进制unicode字符和汉字相互转换

    在编程领域,尤其是在涉及到字符编码的时候,理解和操作16进制Unicode字符与汉字之间的转换是一项基本技能。在C#环境中,这项任务可以通过内置的类库和方法来实现。本工具正是针对这一需求,提供了一个方便的C#实现...

    处理生僻字

    在Visual Studio 2010中,可以创建一个新的C# Class Library项目,然后定义一些方法来处理生僻字,如转换编码、验证生僻字、显示生僻字列表等。例如,可以创建一个静态类`RareCharacterHelper`,并提供如`...

    汉字与unicode编码(十六进制)对照表

    在这个“汉字与unicode编码(十六进制)对照表”中,我们可以找到汉字与其对应的Unicode编码,这对于编程、文本处理以及国际化和本地化工作来说具有重要的参考价值。 Unicode编码系统包括多个平面,其中基本多文种...

    PB9写入非中文数据库的乱码问题

    //ansi 字符转为 unicode 十进制值 function int MultiByteToWideChar(uint codepage, ulong dwflags, ref string lpmultibytestr, intcchmultibyte, ref long lpwidecharstr, int cchwidechar) library "kernel32...

    C#随即验证码的实现

    4. 为了避免生成生僻字,还需要排除D7区之后的编码,因为这些编码通常包含不常见的汉字。 需要注意的是,生成的随机汉字验证码还应考虑到易读性,避免使用用户难以识别或输入的字符。此外,可以结合数字和英文字符...

    51单片机汉字显示屏的字库软件

    编码过程将汉字转换为特定的二进制码,以便在单片机中存储和处理。 2. **点阵字库**:汉字在显示屏上以像素点阵的形式显示,常见的有16x16和24x24点阵。每个汉字由对应点阵的二进制数据组成,这些数据存储在单片机...

    可以把编码转换成 gb2312编码lib.UTF8toGB2312.js

    需要注意的是,由于GB2312编码只能覆盖有限的中文字符,对于不包含在GB2312中的Unicode字符(如繁体字、生僻字或后来添加的汉字),转换可能会丢失信息。因此,在现代Web开发中,更推荐使用UTF-8编码,因为它能支持...

    适用于各种编程中文汉字验证码制作

    2. 将这两个16进制数转换为字节数组。 3. 使用Encoding类的GetString()方法将字节数组解码为汉字字符。 4. 重复以上步骤,生成所需数量的汉字字符,组合成验证码字符串。 5. 添加干扰元素,如扭曲、加噪等,增加机器...

    c#汉字乱码处理

    编码是字符集与二进制数据之间的转换规则,不同的系统或软件可能默认使用不同的编码格式,如UTF-8、GBK(GB2312的扩展)、UTF-16等。 ### 1. 编码识别与设置 为了解决C#中汉字乱码的问题,关键在于正确识别文件的...

    汉字内码查看器(编程专用)

    GBK是在GB2312基础上扩展的,增加了许多生僻字和繁体字,支持20902个汉字,兼容GB2312编码。 3. **Big5编码** Big5编码主要用于台湾和香港地区,主要针对繁体字,它也是一个双字节编码系统,包含了约13000个汉字。...

    transcoder.rar

    GBK是GB2312的扩展,是中国大陆广泛使用的汉字编码标准,它包含了大部分常用汉字和部分生僻字,使用双字节编码,共能表示20902个字符。GBK是在ASCII的基础上扩展的,因此GBK编码的前128个字符与ASCII相同。 在STM32...

    MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)

    函数通过计算GBK编码的十进制值,并将其与预定义的GBK码段区间进行比较,从而确定对应的首字母。例如,对于字符串"中国人",它会返回"Z",即"中"的拼音首字母。 函数定义如下: ```sql CREATE FUNCTION `...

    区位码查询

    这对于输入生僻字或者不常见的汉字特别有用,特别是在没有拼音输入法的年代。 文字加密则与区位码查询有关联,因为任何字符编码都可能涉及加密。在传输或存储包含汉字的数据时,为了保护信息安全,有时会采用加密...

    基于stm32开发例程

    GB2312编码包含了6763个常用汉字,GBK则在此基础上增加了许多繁体字和生僻字。在STM32中,汉字通常以点阵形式存储,例如HZK16就是一种16x16像素的汉字点阵库。这种库包含了大量的汉字点阵数据,每个汉字由16行16列的...

    python学习笔记ing

    Unicode最常用的编码形式是UTF-16,即使用两个字节来表示大多数字符,但某些特殊字符(如生僻字)可能需要四个字节。 - **UTF-8**是一种可变长度的编码方式,能够兼容ASCII并有效地编码Unicode字符。对于常见的英文...

    常用字符集简介

    除了汉字之外,GB2312字符集中还包含了希腊字母、日文平假名和片假名字母、俄语西里尔字母等其他字符,但不支持繁体汉字和一些生僻字。GB2312的兼容性较差,无法覆盖更多的汉字和符号,因此在后续的发展中被其他更...

    unicode编码表

    内容部分展示了一部分汉字的Unicode编码,例如“一”的Unicode编码是0x4E00,转换成十进制是19968。值得注意的是,ASCII编码是Unicode的一个子集,ASCII编码的字符在Unicode编码中仍然保持一致,比如字母"a"在ASCII...

    IT知识竞赛题目

    在计算机中,作为一个整体被传送和运算的一串二进制码叫做计算机字 计算机字是指在计算机中作为一个整体处理的数据单位。这个单位的大小通常与处理器的字长一致。 #### 19. 在磁盘中的程序是以文件的方式来存储的...

Global site tag (gtag.js) - Google Analytics