문자 인코딩 문제 학습 노트

6614 단어 .netBlogD 언어
문자 인코딩 문제 학습 노트
 
본고는 주로 몇 가지 흔히 볼 수 있는 인코딩 방식과 상호 관계를 토론한다
(ISO-8859-1、GBK、GB2312、GB18030、UTF-8、UTF-16、UTF-16BE、UTF-16LE)
 
ISO-8859-1:
ISO/IEC 8859-1, 일명 Latin-1 또는'서유럽어'라고도 부르며 국제 표준화 기구ISO/IEC 8859의 첫 번째 8자리 문자 세트입니다.그것은 ASCII를 바탕으로 비어 있는 0xA0-0xFF의 범위 내에 92개의 자모와 기호를 추가하여 변음 부호라틴 문자 언어로 사용하도록 한다.
자세한 내용은 http://wiki.ccw.com.cn/ISO_8859-1
GBK、GB2312、GB18030、BIG5:
GB2312에 대응하는 간체 한자의 인코딩이고 BIG5는 번체 한자의 인코딩이다.GBK는 간체 번체의 한자를 인코딩하고 GB2312와 아래로 호환한다.GB18030은 최신 한자 인코딩 문자 집합 국가 표준으로 GBK와 GB2312 표준을 아래로 호환한다.GB18030 인코딩은 1, 24 바이트가 길어지는 인코딩이고 GB18030 인코딩은 코드 공간에서 유니코드 표준과 일일이 대응한다는 점은 UTF-8 인코딩과 유사하다.
자세한 내용은 http://blog.csdn.net/liujinchengjx/archive/2007/03/13/1527909.aspx
 
UTF-8、UTF-16、UTF-16BE、UTF-16LE:
자세한 내용은 http://blog.csdn.net/fmddlmyy/archive/2005/05/04/372148.aspx
 
 
문자열이 각종 문자 집합 아래에 있는 인코딩 값을 되돌려줄 수 있는 코드를 첨부합니다
D:\workspace\JavaBaseKnowledge\src>java CharsetTest "  A"
   :[  A]
===================================
java   :7f16 7801 41
   :5;  :GB2312
   :5;  :GBK
   :5;  :GB18030
   :3;  :ISO-8859-1
   :7;  :UTF-8
   :8;  :UTF-16
   :6;  :UTF-16BE
   :6;  :UTF-16LE
   :5;  :defaulCharset
[  A] GB2312       :b1 e0 c2 eb 41
[  A] GBK          :b1 e0 c2 eb 41
[  A] GB18030              :b1 e0 c2 eb 41
[  A] ISO-8859-1           :3f 3f 41
[  A] UTF-8        :e7 bc 96 e7 a0 81 41
[  A] UTF-16       :fe ff 7f 16 78 1 0 41
[  A] UTF-16BE             :7f 16 78 1 0 41
[  A] UTF-16LE             :16 7f 1 78 41 0
[  A] defaulCharset        :b1 e0 c2 eb 41

    :1.GB2312,GBK,GB18030  2   ,      ;UTF-8  3   ,      。        


        2.JAVA        UTF-16BE

 import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class CharsetTest {

	private final static String DEFAULT_CHARSET = "defaulCharset";

	/**       */
	private final static String[] CHARSETNAME_ARRAY = { "GB2312", "GBK",
			"GB18030", "ISO-8859-1", "UTF-8", "UTF-16", "UTF-16BE", "UTF-16LE",
			DEFAULT_CHARSET };

	/**
	 *                         
	 * 
	 * @param aStr
	 *               
	 * @param aCharsetName
	 *                
	 */
	public static void printByteLength(String aStr, String aCharsetName) {
		System.out.print("   :");
		try {
			byte[] bytes;
			if (DEFAULT_CHARSET.equals(aCharsetName)) {
				bytes = aStr.getBytes();
			} else {
				bytes = aStr.getBytes(aCharsetName);
			}
			System.out.print(bytes.length);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(";  :" + aCharsetName);
	}

	/**
	 *                         
	 * 
	 * @param aStr
	 *               
	 */
	public static void printByteLength(String aStr) {
		for (String aCharsetName : CHARSETNAME_ARRAY) {
			printByteLength(aStr, aCharsetName);
		}
	}

	/**
	 *                ,16    
	 * 
	 * @param aStr
	 *               
	 * @param aCharsetName
	 *                
	 */
	public static void printByte(String aStr, String aCharsetName) {
		System.out.print("[" + aStr + "] " + aCharsetName + "\t      :");
		try {
			byte[] bytes;
			if (DEFAULT_CHARSET.equals(aCharsetName)) {
				bytes = aStr.getBytes();
			} else {
				bytes = aStr.getBytes(aCharsetName);
			}
			List<String> byteStrs = getByteStr(bytes);
			System.out.print(join(byteStrs, " "));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println();
	}

	public static List<String> getByteStr(byte[] bytes) {
		List<String> byteStrs = new ArrayList<String>();
		for (byte aByte : bytes) {
			String hexString = Integer.toHexString(aByte & 0xFF);
			//String hexString = Integer.toString(aByte & 0xFF);
			//String hexString = Byte.toString(aByte);
			byteStrs.add(hexString);
		}
		return byteStrs;
	}

	/**
	 *                ,16    
	 * 
	 * @param aStr
	 *               
	 */
	public static void printByte(String aStr) {
		for (String aCharsetName : CHARSETNAME_ARRAY) {
			printByte(aStr, aCharsetName);
		}
	}

	/**
	 *       java         ,16    
	 * 
	 * @param aStr
	 *               
	 */
	public static void printJavaInnerUnicode(String aStr) {
		System.out.print("java   :");
		for (int i = 0, length = aStr.length(); i < length; i++) {
			char aChar = aStr.charAt(i);
			String yingHex = Integer.toHexString(aChar);
			System.out.print(yingHex + " ");
		}
		System.out.println();
	}

	public static <T> String join(final Collection<T> objs,
			final String delimiter) {
		if (objs == null || objs.isEmpty())
			return "";
		Iterator<T> iter = objs.iterator();
		StringBuffer buffer = new StringBuffer(iter.next().toString());
		while (iter.hasNext())
			buffer.append(delimiter).append(iter.next().toString());
		return buffer.toString();
	}

	public static void main(String[] args) {
		if (args.length == 0) {
			String usage = "Usage: java CharsetTest inputString";
			System.out.println(usage);
			return;
		}
		String ch = args[0];

		System.out.println("   :[" + ch
				+ "]
==================================="); printJavaInnerUnicode(ch); CharsetTest.printByteLength(ch); CharsetTest.printByte(ch); } }

 
 
   

좋은 웹페이지 즐겨찾기