실패한 이유를 알려면 new String(str.getBytes("GBK"),"UTF-8");의 의미를 이해해야 합니다. 우선 Java의 문자열은 내부적으로 UTF-16LE로 인코딩됩니다. str.getBytes("GBK")는 바이트 배열을 얻었으며 내용은 str의 인코딩을 GBK로 변환하는 것입니다. new String(str.getBytes("GBK"),"UTF-8")은 이 바이트 배열의 내용을 UTF-8로 인코딩된 데이터로 처리하고 이를 문자열(UTF-16LE)로 변환합니다. 알았나요? 이것이 작동하면 유령이 생길 것입니다.
클라이언트와 서버는 모두 Java이므로 Java의 문자열 인코딩은 UTF-16이어야 합니다. 시스템 인코딩(Windows 또는 Linux)의 영향을 받지 않습니다. 이 경우 문자열을 직접 보내지 않는 것이 가장 좋습니다. 문자열은 사용하는 라이브러리에 의해 자동으로 인코딩으로 변환되기 때문입니다(예: tomcat, 기본값 iso8859-1).
바이트 배열을 직접 보내고 받을 수 있다면 프로토콜 사양 UTF-8이 가능합니다. 어느 쪽이든 수신한 데이터는 new String(data, "UTF-8")이고 전송된 데이터는 str.getBytes("UTF-8")입니다.
클라이언트 코드를 변경할 수 없거나 C 또는 다른 언어로 작성된 경우. 클라이언트가 GBK 데이터를 전송하고 있다고 확신하는 경우. 서버가 바이트 배열을 직접 수신할 수 있는 경우 새 문자열(data, "GBK")을 구문 분석할 수 있습니다. 반환되면 바이트 배열 str.getBytes("GBK")이기도 합니다.
문자열만 보내고 받을 수 있는 경우 문자열을 구성하고 변환되는 인코딩을 설정해야 합니다. 예를 들어 tomcat의 경우 GET 데이터의 경우 web.xml을 수정하고 URL 인코딩 설정 항목을 추가해야 합니다. POST 데이터 의 경우 을 변환하려면 필터를 작성해야 합니다. HTTP 통신 클래스인 경우 SetEncoding과 같은 메서드를 제공할 수 있습니다.
클라이언트인 경우: 서버에서 가져온 문자열은 UTF-8로 인코딩되어 있습니다. 표시해야 하는 경우 먼저 문자열을 UTF-8에 따라 바이트코드로 디코딩한 다음 GBK 인코딩을 따릅니다. 서버로 보내는 문자열도 utf-8로 인코딩되어야 합니다. GBK로 인코딩된 문자열을 바이트코드로 디코딩한 다음 utf-8에 따라 인코딩해야 합니다. 그 반대도 마찬가지입니다. 문자가 깨져 보이는 이유가 단말기의 인코딩 문제일 수도 있나요?
실패한 이유를 알려면 new String(str.getBytes("GBK"),"UTF-8");의 의미를 이해해야 합니다.
우선 Java의 문자열은 내부적으로 UTF-16LE로 인코딩됩니다.
str.getBytes("GBK")는 바이트 배열을 얻었으며 내용은 str의 인코딩을 GBK로 변환하는 것입니다.
new String(str.getBytes("GBK"),"UTF-8")은 이 바이트 배열의 내용을 UTF-8로 인코딩된 데이터로 처리하고 이를 문자열(UTF-16LE)로 변환합니다.
알았나요? 이것이 작동하면 유령이 생길 것입니다.
클라이언트와 서버는 모두 Java이므로 Java의 문자열 인코딩은 UTF-16이어야 합니다. 시스템 인코딩(Windows 또는 Linux)의 영향을 받지 않습니다.
이 경우 문자열을 직접 보내지 않는 것이 가장 좋습니다. 문자열은 사용하는 라이브러리에 의해 자동으로 인코딩으로 변환되기 때문입니다(예: tomcat, 기본값 iso8859-1).
바이트 배열을 직접 보내고 받을 수 있다면 프로토콜 사양 UTF-8이 가능합니다. 어느 쪽이든 수신한 데이터는 new String(data, "UTF-8")이고 전송된 데이터는 str.getBytes("UTF-8")입니다.
클라이언트 코드를 변경할 수 없거나 C 또는 다른 언어로 작성된 경우. 클라이언트가 GBK 데이터를 전송하고 있다고 확신하는 경우. 서버가 바이트 배열을 직접 수신할 수 있는 경우 새 문자열(data, "GBK")을 구문 분석할 수 있습니다. 반환되면 바이트 배열 str.getBytes("GBK")이기도 합니다.
문자열만 보내고 받을 수 있는 경우 문자열을 구성하고 변환되는 인코딩을 설정해야 합니다. 예를 들어 tomcat의 경우 GET 데이터의 경우 web.xml을 수정하고 URL 인코딩 설정 항목을 추가해야 합니다. POST 데이터 의 경우 을 변환하려면 필터를 작성해야 합니다. HTTP 통신 클래스인 경우 SetEncoding과 같은 메서드를 제공할 수 있습니다.
URL인 경우 URLEncoder/URLDecoder 클래스를 사용할 수 있습니다
클라이언트인 경우:
으아아아서버에서 가져온 문자열은 UTF-8로 인코딩되어 있습니다. 표시해야 하는 경우 먼저 문자열을 UTF-8에 따라 바이트코드로 디코딩한 다음 GBK 인코딩을 따릅니다.
서버로 보내는 문자열도 utf-8로 인코딩되어야 합니다. GBK로 인코딩된 문자열을 바이트코드로 디코딩한 다음 utf-8에 따라 인코딩해야 합니다.
그 반대도 마찬가지입니다.
문자가 깨져 보이는 이유가 단말기의 인코딩 문제일 수도 있나요?
iso8859-1을 중간 문자열로 인코딩할 수 있습니다. gbk를 utf-8로 직접 변환하면, 즉 2바이트가 3바이트로 변환됩니다. 홀수개의 한자가 있으면 마지막 바이트를 변환할 때 오류 출력이 계산됩니까? , 여전히 왜곡됩니다.