2014-11-18 9 views
2
Scanner sc = new Scanner(System.in); 
    System.out.println("Enter text: "); 
    String text = sc.nextLine(); 
    try { 
     String result = new String(text.getBytes("windows-1251"), Charset.forName("UTF-8")); 
     System.out.println(result); 
    } catch (UnsupportedEncodingException e) { 
     System.out.println(e); 
    } 

나는 키보드를 변경하려고합니다. 입력 키보드, 출력 latin. 예 : qwerty +> ƼÙукенjava 변환 문자열 windows-1251 to utf8

작동하지 않습니다. 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까?

+2

처음부터 무엇을하려했는지 확실하지 않습니다. 이러한 종류의 변환은 거의 항상 * 항상 * 잘못되었습니다 ... –

+0

이 게시물은 당신을 도울 수; http://stackoverflow.com/questions/2288490/how-can-i-convert-a-cp1251-byte-array-to-a-utf8-string –

+0

>> 시작하기 위해 무엇을하려했는지 확실하지 않습니다. .이런 종류의 변환은 거의 틀린 것입니다. 나는 키보드를 바꾸려고합니다 : 입력 된 cyrylic 키보드, 출력 latin. 예 : QWerty +> ЙЦукен. – halem

답변

2

String/char/Reader/Writer는 내부적으로 유니 코드이므로 모든 스크립트를 결합 할 수 있습니다. 이것은 C/C++과 큰 차이가 있습니다.

이제 System.in은 역사적인 이유로 InputStream입니다. 인코딩을 사용해야한다는 표시가 필요합니다.

Scanner sc = new Scanner(System.in, "Windows-1251"); 

위의 내용은 System.in의 키릴 문자 변환을 명시 적으로 설정합니다. 이 선택적 매개 변수가 없으면 기본 인코딩이 사용됩니다. 그것이 소프트웨어에 의해 변경되지 않았다면 그것은 플랫폼 인코딩 일 것입니다. 그래서 이것은 정확했을 수도 있습니다.

지금 text은 System.in에서 유니 코드로 키릴 문자를 포함하고 있습니다.

당신과 UTF-8 바이트 얻을 것

: 텍스트가 잘못의

byte[] bytes = text.getBytes(StandardCharsets.UTF_8); 

오래된 "재 코딩을"; 이 줄을 버려라. 실제로 모든 Windows-1251 바이트가 유효한 UTF-8 멀티 바이트 시퀀스는 아닙니다.

String result = text; 

System.out.println(result); 

System.out은 오히려 거의 사용되지 않는 역사 클래스 인 PrintStream입니다. 기본 플랫폼 인코딩을 사용하여 인쇄합니다. 기본 인코딩이 정확하다는 점을 다소간 의지 할 수 있습니다. UTF-8 인코딩 된 파일에 대한 인쇄의

System.out.println(result); 

: 윈도우 메모장 UTF-8 인코딩을 인식 할 수 있도록 I가 앞에 유니 BOM 문자를 추가

여기
byte[] bytes = ("\uFEFF" + text).getBytes(StandardCharsets.UTF_8); 
Path path = Paths.get("C:/Temp/test.txt"); 
Files.writeAllBytes(path, bytes); 

. 일반적으로 BOM을 사용하여 피해야합니다. 제로 - 너비 공간 (= 보이지 않음)이며 CSV, XML, 파일 연결, 컷 - 복사 - 붙여 넣기와 같은 모든 종류의 포맷으로 혼란을 일으 킵니다.

0

다른 질문에 대한 답을 얻었고 아무도 당신에게 대답하지 않은 이유는 제목이 질문에 맞지 않기 때문입니다. 문자 세트간에 변환하려고 시도하지 않고 오히려 키보드 레이아웃간에 변환하려고했습니다.

여기서는 글자 레이아웃을 전혀 염려하지 말고 단순히 줄을 읽고 글자 배열로 변환 한 다음 미리 정의 된지도를 사용하여이를 변환합니다.

코드는 다음과 같이 될 것입니다 : 이제

Map<char, char> table = new TreeMap<char, char>(); 
table.put('q', 'й'); 
table.put('Q', 'Й'); 
table.put('w', 'ц'); 
// .... etc 

String text = sc.nextLine(); 
char[] cArr = text.toCharArray(); 
for(int i=0; i<cArr.length; ++i) 
{ 
    if(table.containsKey(cArr[i])) 
    { 
    cArr[i] = table.get(cArr[i]); 
    } 
} 
text = new String(cArr); 
System.out.println(text); 

, 난 그 코드를 테스트 할 시간이 없어,하지만 당신은 당신의 작업을 수행하는 방법의 아이디어를 얻을 것이다.