문자 (문자열) 와 유 니 코드 변환

3815 단어 unicode
어제 회사 에서 동료 가 중국어 와 asicii 코드 를 어떻게 바 꾸 느 냐 고 묻 는 것 을 들 었 습 니 다.나 는 당시 에 매우 차 이 였 는데, asicii 코드 가 어떻게 중국 어 를 표시 할 수 있 습 니까?!원래는 \ uXXXX (X 는 16 진수, 비 X) 와 같은 코드 를 중국어 로 변환 하려 고 했 습 니 다.그래, 나 는 방금 "이것 이 asicii 코드 라 니!" 라 는 것 을 알 았 다.
그래서 지금 인터넷 에서 자 료 를 찾 아 참고 코드 를 최적화 시 켰 습 니 다. 예 를 들 어 StringBuffer 의 사용 과 정규 표현 식 은 합 법성 을 검증 합 니 다.
사 고 를 통 해 유 니 코드 가 문자 로 전환 하 는 것 을 이해 할 수 있 고 반대 되 는 전환 의 원리 에 대해 기본적으로 이해 할 수 있 으 며 원 리 를 찾 아야 한다.
기본 이론:
유 니 코드 (통일 코드, 유 니 버 설 코드, 단일 코드) 는 컴퓨터 에서 사용 하 는 문자 인 코딩 이다.이 는 모든 언어 에서 모든 문자 에 통일 되 고 유일한 바 이 너 리 인 코딩 을 설정 하여 크로스 언어, 크로스 플랫폼 에서 텍스트 변환, 처리 요 구 를 만족 시 킵 니 다.현재 6.0 버 전이 발표 되 었 다.유 니 코드 는 인간 의 모든 읽 을 수 있 는 문자 집합 을 대표 할 정도 로 큰 문자 집합 을 정의 합 니 다.유 니 코드 는 국제 기구 가 제정 한 세계 의 모든 문자 와 기 호 를 수용 할 수 있 는 문자 인 코딩 방안 이다.유 니 코드 는 숫자 0 - 0x10FFFF 로 이 문 자 를 매 핑 합 니 다. 최대 1114112 자 를 수용 하거나 1114112 야드 의 비트 가 있 습 니 다.코드 는 문자 에 배분 할 수 있 는 숫자 입 니 다.
유 니 코드 구현 방식 은 UTF - 8, UTF - 16, UTF - 32 다.
UTF - 8 은 유 니 코드 를 바이트 단위 로 인 코딩 하고, 범위 별 문 자 는 길이 별로 인 코딩 한다.
UTF - 16 인 코딩 은 16 비트 부호 없 는 정수 단위 입 니 다.
UTF - 32 인 코딩 은 부호 없 는 정수 32 자리 단위 입 니 다.유 니 코드 의 UTF - 32 인 코딩 은 그 에 대응 하 는 32 비트 부호 없 는 정수 이다.
예 를 들 어 \ u1234 의 유 니 코드 는 utf - 16 의 실현 방식 을 취해 야 하기 때문에 아래 의 encode 방법 에서 먼저 문 자 를 utf - 16 방식 으로 표시 하고 8bit 마다 byte 에 넣 은 다음 에 byte 를 16 진법 으로 표시 하 며 4 개의 16 진수 기 호 는 한 글자 의 유 니 코드 인 코딩 을 표시 합 니 다.
그 중에서 0xff 와 연산, 삭제 기 호 는 두 단계 가 모두 필요 하 다 는 것 을 나타 낸다.
1. 0xff 와 함께 하지 않 고 bytes Utf 16 [n] 을 출력 합 니 다. 의아 합 니 다. byte 는 8bit 가 아 닙 니까? 출력 2 + 16 비트 기 호 를 어떻게 저장 합 니까?뒤의 두 기 호 는 필요 하기 때문에 & 조작 이 있 습 니 다.기호 로 인 한 전방 보 위 를 나중에 이해 합 니 다. -의 전 보 1, 16 제 후 전 부 는 f, + 보 0, 16 제 후 에는 여전히 byte 의 16 제 이다.그래서 여 기 는 0xff 와 함께 8 자리 만 남 게 해 야 합 니 다.인 코딩 에 필요 한 것 입 니 다.
2. 유 니 코드 표준 은 바이트 흐름 을 전송 하기 전에 BOM 으로 되 어 있 는 문자 '0 너비 무 중단 스페이스 바' 를 먼저 전송 하 는 바이트 순 서 를 BOM (Byte Order Mark) 으로 구분 하 는 것 을 권장 합 니 다.이 문자 의 인 코딩 은 FEFF 이 며, 반대로 FFFE (UTF - 16) 와 FFFE 0000 (UTF - 32) 은 유 니 코드 에서 정의 되 지 않 은 코드 비트 이 므 로 실제 전송 에 나타 나 서 는 안 되 므 로 기호 조작 을 삭제 합 니 다.

//     unicode
	public static String encode(String str) {
		if (null == str || str.equals(""))
			return "    ";
		StringBuffer sb = new StringBuffer();
		try {
						// 16bit          , 8bit byte  。
			byte bytesUtf16[] = str.getBytes("UTF-16");
			for (int n = 0; n < bytesUtf16.length; n++) {
				//     8 ,  16    。
				str = (java.lang.Integer.toHexString(bytesUtf16[n] & 0XFF));
				//     16       
				sb.append((str.length() == 1) ? ("0" + str) : str);
			}
			//          
			str = sb.toString().toUpperCase().substring(4);
			char[] chs = str.toCharArray();
			str = "";
			for (int i = 0; i < chs.length; i = i + 4) {
				str += "\\u" + chs[i] + chs[i+1] + chs[i+2] + chs[i+3];
			}
		} catch (Exception e) {
			System.out.print(e.getMessage());
			str = "      ";
		} finally {
			return str;
		}
	}
	
	// unicode    
	public static String decode(final String str) {
		if(null == str || str.equals("")){
			return "  unicode";
		}
                 //        
		Pattern p = Pattern.compile("(\\\\u[0-9a-fA-F]{4})+");
		Matcher m = p.matcher(str);
		if(!(m.find() && m.group().equals(str))){
			return "    ";
		}
		String[] strs = str.split("u");
		StringBuffer sb = new StringBuffer();
		for (int i = 1; i <= strs.length - 1; i++) {
			sb.append(new Character((char) Integer.parseInt(strs[i].replace("\\", ""), 16)));
		}
		return sb.toString();
	}


좋은 웹페이지 즐겨찾기