>  Q&A  >  본문

Java 两系统接口调用字符乱码问题?

PHP中文网PHP中文网2741일 전422

모든 응답(4)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:05:23

    실패한 이유를 알려면 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과 같은 메서드를 제공할 수 있습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:05:23

    URL인 경우 URLEncoder/URLDecoder 클래스를 사용할 수 있습니다

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-18 10:05:23

    클라이언트인 경우:
    서버에서 가져온 문자열은 UTF-8로 인코딩되어 있습니다. 표시해야 하는 경우 먼저 문자열을 UTF-8에 따라 바이트코드로 디코딩한 다음 GBK 인코딩을 따릅니다.
    서버로 보내는 문자열도 utf-8로 인코딩되어야 합니다. GBK로 인코딩된 문자열을 바이트코드로 디코딩한 다음 utf-8에 따라 인코딩해야 합니다.
    그 반대도 마찬가지입니다.
    문자가 깨져 보이는 이유가 단말기의 인코딩 문제일 수도 있나요?

    으아아아

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:05:23

    iso8859-1을 중간 문자열로 인코딩할 수 있습니다. gbk를 utf-8로 직접 변환하면, 즉 2바이트가 3바이트로 변환됩니다. 홀수개의 한자가 있으면 마지막 바이트를 변환할 때 오류 출력이 계산됩니까? , 여전히 왜곡됩니다.

    회신하다
    0
  • 취소회신하다