2017-04-25 8 views
0

이유는 되돌릴 수 없습니다 거기에 약간의 IDN입니다 :Java IDN 기능이 되돌릴 수 없습니까?

String domain = "aʼnċăwb7rňuħ.eu"; 
System.out.println(domain); 
domain = IDN.toASCII(domain); 
System.out.println(domain); 
domain = IDN.toUnicode(domain); 
System.out.println(domain); 

이 표시됩니다 : 당신이 볼 수 있듯이

aʼnċăwb7rňuħ.eu 
xn--anwb7ru-93a5e8ozmq2m.eu 
aʼnċăwb7rňuħ.eu 

가, 두 번째 문자가 갈라되었습니다!

감사

답변

2

이것은 의도적으로 설계된 것입니다. 내가 알 수 있듯이 문자열의 두 번째 문자는 \ u0149 코드 포인트입니다. 최신 유니 코드 차트에 따르면

이 문자는 사용되지 않으며 그것의 사용이 입니다 강력하게 유니 코드 차트는 사용되지 않는 코드 포인트 \u006e 다음 \u02bc에 해당 말한다

을 낙담.

IDN.toASCII(String)가 수행하는 javadocs의 첫 번째 단계는 RFC 3491 stringprep/nameprep 알고리즘을 사용하여 입력 문자열의 문자를 처리하는 것입니다. 은 RFC 추상 말한다 :

이 문서는 가능성을 높이기 위해 국제화 된 도메인 이름 (IDN) 레이블을 준비하는 방법을 설명 그 전반에 걸쳐 일반 사용자 에 대한 이해가 가지 방법으로 이름 입력 및 이름 비교 작업 세계. 이 stringprep 프로토콜 프로필은 도메인 이름 시스템 (DNS)을 국제화하기위한 온 - 와이어 프로토콜 모음의 일부로 사용되는 입니다.

(즉, stringprep는 어렵게 한 가지처럼 뭔가 다른 의미가 까다로운 도메인 이름을 만들 수 있도록 설계되어 있습니다.) 사실

, 드릴 다운, 당신은 발견 할 것이다 \u0149에 대한 stringprep 테이블의 규정 된 매핑은 \u02bc\u006e입니다. 유니 코드 코드 차트에 정의 된 등가물입니다.

그리고 ... 그런 일이 일어나고 있습니다.당신은 왕복이 IDN이가 잘못 설립 할 수


요약

  1. 여러분의 기대.
  2. 어쨌든 사용되지 않아야하므로 더 이상 사용하지 말아야합니다. (IDN에서 사용하는 것은 당연한 생각입니다!)
0

이 프로세스의 일부로서 유니 코드 정규화 (NFKC을 형성)을 수행 포함 같이 IDN의 ToASCII 절차는 본질적 비가역 이다. 일반적으로 여러 유니 코드 문자 시퀀스는 동일한 정규화 된 형식을 가질 수 있습니다. IDN toUnicode 절차는 ACE 레이블에서 중 하나를 생성하지만 원래 인코딩 된 것과 동일하다는 보장은 없습니다.

toUnicode(toASCII(x))의 결과가 x과 다른 경우에도 IDN의 목적에 따라 두 가지가 동일하며 더 나아가 서로의 유니 코드 호환성이 있어야합니다. 일반적으로 유니 코드 글꼴로 비슷하게 렌더링됩니다. 그런 의미에서, 당신의 경우에 눈에 띄는 차이가 있다는 것이 놀랍지 만 결론은 당신의 명백한 가역성 기대가 근거가 없다는 것입니다.