기호, 악센트 문자를 영어 알파벳으로 변환
문제는 아시다시피 유니코드 차트에는 수천 개의 문자가 있는데, 비슷한 문자를 모두 영어 알파벳 문자로 변환하고 싶다는 것입니다.
예를 들어 다음과 같은 몇 가지 변환이 있습니다.
ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...
A/a가 20개 이상 있는 걸 봤는데 어떻게 분류해야 할지 모르겠어요.그것들은 건초더미 속의 바늘처럼 보인다.
유니코드 문자 목록은 http://www.ssec.wisc.edu/ ~tomw/tomw/tomw/tomw/tomw/tomw/tomw/temp.http:/http://unicode.org/charts/charindex.html 에서 확인할 수 있습니다.아래로 스크롤을 하면 글자의 변형을 볼 수 있습니다.
Java로 변환하려면 어떻게 해야 하나요?도와주세요.
"How do I remove diaccritics ( accents ) from string" (스트링에서 분음 부호(엔트)를 삭제하는 방법)에서 투고를 재투고인터넷?
이 메서드는 Java에서 정상적으로 동작합니다(단순히 분음 부호(일명 악센트)를 삭제하기 위한 목적입니다.
기본적으로 악센트가 있는 모든 문자를 악센트가 없는 문자로 변환하고 그 뒤에 조합된 분음 부호를 사용합니다.이제 정규식을 사용하여 분음 부호를 제거할 수 있습니다.
import java.text.Normalizer;
import java.util.regex.Pattern;
public String deAccent(String str) {
String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
return pattern.matcher(nfdNormalizedString).replaceAll("");
}
버전 3.0 현재 Apache Commons Lang의 일부입니다.
org.apache.commons.lang3.StringUtils.stripAccents("Añ");
An
http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/ 도 참조해 주세요.
"모두 변환"을 시도하는 것은 문제에 대한 잘못된 접근법입니다.
우선, 당신은 당신이 하려는 일의 한계를 이해할 필요가 있다.다른 사람들이 지적한 것처럼 발음이 다른 이유가 있다.그것은 본질적으로 그 언어의 알파벳에 고유의 의미나 소리 등이 있는 독특한 문자이기 때문이다.: 이 마크를 삭제하는 것은 영어 단어의 임의의 문자를 대체하는 것과 같습니다.이것은 당신이 키릴어 및 아랍어 등 단순히 영어로 "변환"될 수 없는 다른 스크립트 기반 텍스트에 대해 고려하기 전입니다.
어떤 이유로든 문자를 변환해야 하는 경우, 우선 당면한 작업의 범위를 줄이기 위해 이 변환에 접근하는 유일한 합리적인 방법입니다.입력의 출처를 생각해 보세요.어플리케이션을 "서양세계"용으로 코딩하고 있는 경우(어느 것 못지않게 좋은 문구를 사용하는 경우), 아랍어 문자를 해석할 필요는 없을 것입니다.마찬가지로 Unicode 문자 집합에는 수백 개의 수학 기호와 그림 기호가 포함되어 있습니다.사용자가 직접 입력할 수 있는 방법이 없기 때문에 무시할 수 있다고 생각할 수 있습니다.
이러한 논리적 단계를 수행하면 구문 분석할 수 있는 문자 수를 사전 기반 조회/바꾸기 작업이 가능한 수준까지 줄일 수 있습니다.그 후 사전을 만드는 작업은 약간 지루한 작업이 되고 치환을 수행하는 작업은 사소한 작업이 됩니다.사용하는 언어가 네이티브 Unicode 문자(Java와 마찬가지로)를 지원하여 정적 구조를 올바르게 최적화하면 이러한 검색 및 치환 작업이 매우 빠르게 진행됩니다.
이는 최종사용자가 분음문자를 포함한 서지데이터를 검색할 수 있도록 하기 위해 필요한 어플리케이션에서 작업한 경험에서 비롯됩니다.룩업 어레이는 (우리의 경우와 같이) 모든 서유럽 언어의 발음 부호를 커버하기 위해 제작하는 데 약 1일이 걸렸습니다.
「패밀리」를 「t」로 변환하는 부호화는 사실상 랜덤이며, 관련된 Unicode 코드 포인트 정보로 설명할 수 있는 알고리즘을 따르지 않기 때문에, 이 알고리즘을 해결하는 일반적인 방법은 없습니다.
Unicode 문자를 유사한 라틴 문자로 매핑해야 합니다.Unicode 코드 포인트를 나타내는 실제 글리프에 대한 스마트 머신 러닝을 통해 이를 수행할 수 있습니다.하지만 수동으로 지도를 작성하는 것보다 더 많은 노력이 필요할 것 같습니다.특히 매핑을 빌드할 수 있는 많은 예를 가지고 있는 경우에는 더욱 그렇습니다.
명확히 하자면, 치환의 일부는 실제로 유니코드 데이터를 통해 해결할 수 있지만(다른 답변에서 알 수 있듯이), 일부 문자는 단순히 유사한 라틴 문자와 합리적인 연관성이 없습니다.
예:
- """(U+0452 키릴 문자 작은 문자 DJE)는 "h"보다 "d"에 더 가깝지만 "h"를 나타낼 때 사용된다.
- "ŧ"(U+0166 라틴 대문자 T With Stroke)는 이름에서 알 수 있듯이 "T"와 다소 관련이 있지만 "F"를 나타내기 위해 사용됩니다.
- """(U+0E04 태국 문자 KHO KHWAI)는 라틴 문자와 전혀 관련이 없으며 예제에서는 "a"를 나타내기 위해 사용됩니다.
스트링 테스트 완료 : â string string string string string string string string string string string string string string string string string string
테스트 완료:
- Apache Commons Lang3 : AAAAAECEEIIIDDNOOOOOOOOOUUUY output출력
- ICU4j에서의 출력 : AAAAAECEIIIIDDNOOOOOOOOOUUY output
- Output from JUnidecode : AAAAAAECEEEEIIIIDNOOOOOOUUUUUss (problem with Ý and another issue)
- Unidecode : AAAAAAECEEEIIID NOOOOOUUYss로부터의 출력
마지막 선택이 최고입니다.
원래 요청에 이미 응답했습니다.
단, 자바에서 문자 집합을 라틴/영어로 번역하기 위해 범용 번역 코드를 찾고 계신 분들을 위해 아래 답변을 올립니다.
번역의 순진한 의미:최종 형태/대상 문자 집합의 번역 문자열은 원래 형태의 문자열처럼 들립니다.문자 집합을 라틴어(영어 알파벳)로 번역하려면 ICU4(자바의 ICU4J 라이브러리)가 작업을 수행합니다.
자바 코드 스니펫은 다음과 같습니다.
import com.ibm.icu.text.Transliterator; //ICU4J library import
public static String TRANSLITERATE_ID = "NFD; Any-Latin; NFC";
public static String NORMALIZE_ID = "NFD; [:Nonspacing Mark:] Remove; NFC";
/**
* Returns the transliterated string to convert any charset to latin.
*/
public static String transliterate(String input) {
Transliterator transliterator = Transliterator.getInstance(TRANSLITERATE_ID + "; " + NORMALIZE_ID);
String result = transliterator.transliterate(input);
return result;
}
"òı->->oeisoc" 변환이 필요한 경우 시작점을 사용할 수 있습니다.
public class AsciiUtils {
private static final String PLAIN_ASCII =
"AaEeIiOoUu" // grave
+ "AaEeIiOoUuYy" // acute
+ "AaEeIiOoUuYy" // circumflex
+ "AaOoNn" // tilde
+ "AaEeIiOoUuYy" // umlaut
+ "Aa" // ring
+ "Cc" // cedilla
+ "OoUu" // double acute
;
private static final String UNICODE =
"\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
+ "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
+ "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
+ "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
+ "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
+ "\u00C5\u00E5"
+ "\u00C7\u00E7"
+ "\u0150\u0151\u0170\u0171"
;
// private constructor, can't be instanciated!
private AsciiUtils() { }
// remove accentued from a string and replace with ascii equivalent
public static String convertNonAscii(String s) {
if (s == null) return null;
StringBuilder sb = new StringBuilder();
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
int pos = UNICODE.indexOf(c);
if (pos > -1){
sb.append(PLAIN_ASCII.charAt(pos));
}
else {
sb.append(c);
}
}
return sb.toString();
}
public static void main(String args[]) {
String s =
"The result : È,É,Ê,Ë,Û,Ù,Ï,Î,À,Â,Ô,è,é,ê,ë,û,ù,ï,î,à,â,ô,ç";
System.out.println(AsciiUtils.convertNonAscii(s));
// output :
// The result : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o,c
}
}
JDK 1.6은 java.text를 제공합니다.이 작업에 사용할 수 있는 노멀라이저 클래스입니다.
예시를 참조하십시오.
임의의 유니코드를 ASCII로 "변환"하는 문제는 문자의 의미가 문화에 의존한다는 것입니다.예를 들어 독일어를 하는 사람에게는 """을 "ss"로 변환하고, 영어를 하는 사람에게는 "B"로 변환해야 합니다.
게다가 유니코드에는 같은 문자에 복수의 코드 포인트가 있습니다.
결과적으로 이를 수행하려면 각 Unicode 문자와 변환하려는 ASCII 문자로 방대한 테이블을 작성하는 방법밖에 없습니다.KD에서 정규화에 악센트가 있는 문자를 정규화하는 것으로 단축키를 사용할 수 있습니다만, 모든 문자가 ASCII로 정규화되는 것은 아닙니다.또한 Unicode는 글리프의 어떤 부분이 "사건"인지 정의하지 않습니다.
다음은 이 기능을 하는 앱에서 발췌한 내용입니다.
switch (c)
{
case 'A':
case '\u00C0': // À LATIN CAPITAL LETTER A WITH GRAVE
case '\u00C1': // Á LATIN CAPITAL LETTER A WITH ACUTE
case '\u00C2': // Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
// and so on for about 20 lines...
return "A";
break;
case '\u00C6':// Æ LATIN CAPITAL LIGATURE AE
return "AE";
break;
// And so on for pages...
}
사용해보실 수 있습니다.unidecode
이것은 루비 보석 및 cpan의 perl 모듈로 사용할 수 있습니다.기본적으로 이것은 각 Unicode 코드 포인트가 ASCII 문자 또는 문자열과 관련된 거대한 룩업 테이블로 기능합니다.
당신이 원하는 것을 할 수 있는 쉽고 일반적인 방법은 없습니다. 왜냐하면 이 글자들이 당신이 변환하고 싶은 라틴 글자로 보이는 것은 단지 당신의 주관적인 의견이기 때문입니다.그것들은 실제로는 서로 다른 이름들과 소리들을 가진 별개의 편지들로 표면적으로는 라틴 문자처럼 보인다.
이 변환을 원할 경우 비라틴 문자를 변환해야 한다고 생각하는 라틴 문자를 기반으로 자체 변환 테이블을 만들어야 합니다.
(분음 부호만 삭제하는 경우, 이 스레드에 몇 가지 답이 있습니다.의 문자열에서 분음 부호(엔트)를 삭제하려면 어떻게 해야 합니까?NET? 더 일반적인 문제에 대해 설명해주세요.)
파티에 늦었지만 오늘 이 문제에 직면한 후 다음과 같은 답변이 매우 좋다는 것을 알게 되었습니다.
String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD)
.replaceAll("[^\\p{ASCII}]", "");
참고 자료: https://stackoverflow.com/a/16283863
다음 클래스가 성공합니다.
org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter
언급URL : https://stackoverflow.com/questions/1008802/converting-symbols-accent-letters-to-english-alphabet
'programing' 카테고리의 다른 글
matplotlib에서 y축 한계 설정 (0) | 2022.09.24 |
---|---|
오른쪽 조인/왼쪽 조인 또는 내부 조인 사용 시기를 결정하려면 어떻게 해야 합니까? 또는 어떤 테이블이 어느 쪽에 있는지 결정하려면 어떻게 해야 합니까? (0) | 2022.09.24 |
Mariadb ID 시퀀스가 깨질 때마다 min 및 max 변수를 재설정하는 방법 (0) | 2022.09.24 |
MySQL 행의 총계(Grandtotal) (0) | 2022.09.24 |
matplotlib의 색상 지도에서 개별 색상 가져오기 (0) | 2022.09.24 |