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, 파일 연결, 컷 - 복사 - 붙여 넣기와 같은 모든 종류의 포맷으로 혼란을 일으 킵니다.
처음부터 무엇을하려했는지 확실하지 않습니다. 이러한 종류의 변환은 거의 항상 * 항상 * 잘못되었습니다 ... –
이 게시물은 당신을 도울 수; http://stackoverflow.com/questions/2288490/how-can-i-convert-a-cp1251-byte-array-to-a-utf8-string –
>> 시작하기 위해 무엇을하려했는지 확실하지 않습니다. .이런 종류의 변환은 거의 틀린 것입니다. 나는 키보드를 바꾸려고합니다 : 입력 된 cyrylic 키보드, 출력 latin. 예 : QWerty +> ЙЦукен. – halem