Java에서 UTF-8을 US-Ascii로 변환하는 방법
문제
우리는 주로 유럽 고객이 다른 시스템에 배포해야 하는 텍스트(UTF-8)를 입력하는 시스템을 보유하고 있으며 대부분은 UTF-8을 허용하지만 이제는 미국 시스템에만 텍스트를 배포해야 합니다. -아스키 7비트
이제 모든 유럽 문자를 가장 가까운 US-Ascii로 번역해야 합니다.이 작업에 도움이 되는 Java 라이브러리가 있습니까?
지금은 번역 테이블에 추가하기 시작했습니다. Å(스웨덴 AA)->A 등이고 입력한 문자와 일치하는 항목을 찾을 수 없으면 이를 기록하고 물음표로 대체합니다. 그리고 다음 릴리스에서 이를 수정하려고 시도하지만 이는 매우 비효율적이며 다른 누군가가 이전에 비슷한 작업을 수행했을 것입니다.
다른 팁
다음과 같이 할 수 있습니다 (NFD 예제에서 이 핵심 Java 기술 기술 팁):
public static String decompose(String s) {
return java.text.Normalizer.normalize(s, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","");
}
자신만의 테이블을 만드는 대신 텍스트를 정규화 형식 D로 변환할 수 있습니다. 여기서 문자는 기본 문자와 발음 구별 부호로 표시됩니다(예를 들어 "á"는 "a"로 대체되고 그 뒤에 결합된 악센트가 옵니다). ).그런 다음 ASCII 문자가 아닌 모든 항목을 제거할 수 있습니다.
테이블은 여전히 존재하지만 이제 유니코드 표준의 테이블입니다.
NFD 대신 NFKD를 사용해 더 많은 사례를 포착할 수도 있습니다.
참고자료:
에 대한 응답으로 Joe Liversedge가 제공 한 답변, 언급 된 루센 Irolatin1accentFilter 더 이상 존재하지 않습니다 :
대체되었습니다 org.apache.lucene.analysis.asciifoldingfilter :
이 클래스는 처음 127 ASCII 문자 ( "기본 라틴"유니 코드 블록)가 아닌 알파벳, 숫자 및 상징적 유니 코드 문자를 ASCII 동등 물질로 변환합니다. 다음 유니 코드 블록의 문자는 변환됩니다. 그러나 합리적인 ASCII 대안을 가진 캐릭터 만 변환됩니다.
참고 -
이것은 일반적으로 검색 응용 프로그램에 유용합니다. 해당 루센을 참조하십시오 Irolatin1accentFilter 구현. 이것은 실제로 무작위 로컬 구현에 연결하기 위해 설계되지는 않았지만 트릭을 수행합니다.
이를 위해 내장 기능이 있습니다. 관련된 주요 수업은입니다 CharsetEncoder
, 이것은의 일부입니다 nio
패키지. 더 간단한 방법입니다 String.getBytes(Charset)
그것은 a로 보낼 수 있습니다 ByteArrayOutputStream
.
새 문자열 ( "½".getBytes ( "us-ASCII"))
이것이 제가 사용하는 것입니다.
<?php
function remove_accent($str) {
# http://www.php.net/manual/en/function.preg-replace.php#96586
$a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
$b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
return str_replace($a, $b, $str);
}
function SEOify($i){
# http://php.ca/manual/en/function.preg-replace.php#90316
$o = $i;
$o = html_entity_decode($o,ENT_COMPAT,'UTF-8');
$o = remove_accent(trim($o));
$patterns = array( "([\40])" , "([^a-zA-Z0-9_-])", "(-{2,})" );
$replacers = array("-", "", "-");
$o = preg_replace($patterns, $replacers, $o);
return $o;
}
?>
이것이 작동하는 것 같습니다.
private synchronized static String utftoasci(String s){
final StringBuffer sb = new StringBuffer( s.length() * 2 );
final StringCharacterIterator iterator = new StringCharacterIterator( s );
char ch = iterator.current();
while( ch != StringCharacterIterator.DONE ){
if(Character.getNumericValue(ch)>0){
sb.append( ch );
}else{
boolean f=false;
if(Character.toString(ch).equals("Ê")){sb.append("E");f=true;}
if(Character.toString(ch).equals("È")){sb.append("E");f=true;}
if(Character.toString(ch).equals("ë")){sb.append("e");f=true;}
if(Character.toString(ch).equals("é")){sb.append("e");f=true;}
if(Character.toString(ch).equals("è")){sb.append("e");f=true;}
if(Character.toString(ch).equals("è")){sb.append("e");f=true;}
if(Character.toString(ch).equals("Â")){sb.append("A");f=true;}
if(Character.toString(ch).equals("ä")){sb.append("a");f=true;}
if(Character.toString(ch).equals("ß")){sb.append("ss");f=true;}
if(Character.toString(ch).equals("Ç")){sb.append("C");f=true;}
if(Character.toString(ch).equals("Ö")){sb.append("O");f=true;}
if(Character.toString(ch).equals("º")){sb.append("");f=true;}
if(Character.toString(ch).equals("Ó")){sb.append("O");f=true;}
if(Character.toString(ch).equals("ª")){sb.append("");f=true;}
if(Character.toString(ch).equals("º")){sb.append("");f=true;}
if(Character.toString(ch).equals("Ñ")){sb.append("N");f=true;}
if(Character.toString(ch).equals("É")){sb.append("E");f=true;}
if(Character.toString(ch).equals("Ä")){sb.append("A");f=true;}
if(Character.toString(ch).equals("Å")){sb.append("A");f=true;}
if(Character.toString(ch).equals("ä")){sb.append("a");f=true;}
if(Character.toString(ch).equals("Ü")){sb.append("U");f=true;}
if(Character.toString(ch).equals("ö")){sb.append("o");f=true;}
if(Character.toString(ch).equals("ü")){sb.append("u");f=true;}
if(Character.toString(ch).equals("á")){sb.append("a");f=true;}
if(Character.toString(ch).equals("Ó")){sb.append("O");f=true;}
if(Character.toString(ch).equals("É")){sb.append("E");f=true;}
if(!f){
sb.append("?");
}
}
ch = iterator.next();
}
return sb.toString();
}