===================================
Java 애플리케이션을 개발할 때 잘못된 문자가 나타나는 것은 매우 일반적입니다. 결국 유니코드는 현재 gb2312(gbk 단순화 및 big5 전통 포함)를 사용하는 시스템에서 널리 사용되지 않습니다
. 데이터베이스 저장.
==============================
1. 먼저 개발자는 잘못된 코드를 접하는 이유와 어떤 종류의 잘못된 코드(의미 없는 기호, 물음표 문자열 등)를 접하게 되는지 이해해야 합니다.
초보자는 일반적으로 지저분한 문자를 만날 때 당황합니다. 가장 직접적인 반응은 Google을 열고 "java Chinese"(이 문자열은 검색 엔진에서 자주 쿼리됨)를 검색한
다음 다른 사람의 문자를 하나씩 보는 것입니다. 하나. 이렇게 해도 문제가 없지만 아래에 언급된 이유로 인해 목표를 달성하기가 어렵습니다.
즉, 문자가 왜곡되는 이유는 다양하며 해결 방법도 완전히 다릅니다. 문제를 해결하려면 먼저 자신의 "컨텍스트"를 분석해야 합니다.
============================
2. 구체적으로 프로젝트에서 왜곡된 코드의 소스를 확인하는 데 필요한 정보는 무엇입니까?
a. 개발자가 사용하는 운영 체제
b, j2ee 컨테이너의 이름과 버전
c, 데이터베이스 이름, 버전(정확한 버전) 및 JDBC 드라이버 버전
d. 잘못된 소스 코드가 있습니다(예: 시스템 외부에서 나오거나 jsp 페이지에 있습니다. jsp에 있는 경우 헤더 선언도 매우 중요합니다)
========== === =============================================
3. 글자 깨짐의 원인을 초기에 분석하는 방법.
위의 정보를 바탕으로 Javaworld와 같은 포럼에 게시하면 전문가들이 곧 효과적인 솔루션을 제시해 줄 것이라고 믿습니다.
물론 항상 도움을 게시에만 의존할 수는 없지만 문제를 스스로 해결하려고 노력해야 합니다. 시작하는 방법?
a. "왜곡된 코드"가 무엇인지 분석하십시오. 예를 들어 이것은 실제로 어렵지 않습니다.
System.out.println(testString);
이 단락에는 잘못된 코드가 있으므로 철저한 방법을 사용하여 실제 인코딩 형식을 추측할 수도 있습니다.
System.out.println(new String(testString.getBytes(”ISO-8859-1″),”gb2312″));
System.out.println(new String(testString.getBytes(”UTF8″),”gb2312″));
System.out.println(new String(testString.getBytes(”GB2312″),”gb2312″));
System.out.println(new String(testString.getBytes("GBK"),"gb2312"));
System.out.println(new String(testString.getBytes("BIG5"),"gb2312"));
잠깐, 위의 코드는 지정된 인코딩 형식을 사용하여 testString의 "잘못된 코드"를 읽고 이를 gb2312로 변환한다는 의미입니다(여기서는 중국어만 예로 사용됩니다).
그러면 어떤 변환 결과가 괜찮은지 알 수 있습니다. 그게 전부입니다. . .
b. 위 단계를 사용하여 올바른 중국어를 얻을 수 있다면 데이터가 확실히 있지만 인터페이스에 올바르게 표시되지 않는다는 의미입니다. 그런 다음 두 번째 단계는 보기 부분을 수정하는 것입니다
. 일반적으로 확인해야 할 것은 jsp에서 올바른 페이지 인코딩이 선택되었는지 여부입니다.
많은 분들이 오해하고 있는 점을 지적하고 싶습니다. 바로 <%@ page contentType="text/html; charset=GB2312″ %> 지시문과 <META http-equiv=Content-Type
content="text
입니다./html; charset= gb2312″>둘 사이의 차이점. 일반적으로 인터넷의 많은 기사에서 중국 문제를 언급할 때, 데이터베이스에서 유니코드 또는 gb2312 저장소를 선택하는 것은 jsp의 페이지 지시문을
사용하여
인코딩을 선언함으로써 해결할 수 있다고 말합니다 .그러나 나는 이 발언이 매우 무책임하다고 생각하며, 애초에 존재하지도 않았던 왜곡된 코드에 대해 우울하게 많은 시간을 소비하게 만들었다. 실제로 페이지의 역할은
JSP가 HTML로 컴파일되는 과정에서 표현식의 문자열을 "읽기" 위해 Java가 코딩 방법을 제공하는 것입니다(위의 세 번째 문의 역할과 다소 유사)
. 메타는 잘 알려져 있습니다. 최종 데이터를 "표시"하는 데 사용되는 IE 브라우저에 대한 인코딩 옵션을 제공합니다. 하지만 저는 항상 페이지를 메타로 사용했는데,
이로 인해 원래 iso-8859였던 데이터가 페이지 명령에 의해 gb2312로 읽히게 되어 왜곡되었기 때문에 코딩을 추가했습니다. 문자열 데이터를 모두 변환하는 변환 함수입니다. 모두 iso8859에서 gb2312로 변경되었습니다(
왜
이렇게 바꿨는지, 당시에는 정상적으로 표시될 수 있어서 별 생각이 없었는데 이렇게 바꿨네요 ㅎㅎ , 그 당시에는 문제를 천천히 해결할 시간이 없었습니다.)================================================= =============
4. 데이터베이스에는 어떤 인코딩이 더 좋나요?
현재 인기 있는 DB로는 주로 sql server, mysql, oracle, DB2 등이 있습니다. 그 중 mysql은 무료 DB 중 선두주자로 설치와 구성이 상대적으로 편리하고
해당
드라이버도 상대적으로 우수합니다. 완전합니다. 가격 대비 성능 비율은 절대적입니다. mysql을 예로 들어보겠습니다.
저는 개인적으로 저장을 위해 mysql의 기본 인코딩인 iso-8859-1(mysql 옵션의 latin-1에 해당)을 사용하는 것을 권장합니다. 몇 가지 주된 이유가 있습니다. 첫째, iso-8859-1은
중국어
를 잘 지원하고 , 둘째, Java의 기본 인코딩과 일치하므로 적어도 여러 곳에서 인코딩을 변환하는 문제를 제거합니다. 안정적이고호환성도 좋다
.특정 DB 제품에서 멀티인코딩을 지원하기 때문에 다른 DB와의 비호환은 물론, 자체 버전이 다르더라도 호환성 문제가 발생할 수 있기 때문이다.
예를 들어, mysql 4.0 이전 제품에서는 많은 중국어 솔루션이 gb2312 등의 인코딩을 설정하기 위해 연결에서 CharacterEncoding 필드를 사용합니다.
원본 데이터는 ISO8859_1로 인코딩되어 있고 jdbc 드라이버는 지정된 데이터를 사용하기 때문에
괜찮습니다.URL에서 문자 세트는 인코딩에 사용되며 resultSet.getString(*)은 인코딩된
문자열을 가져옵니다. 이런 방식으로 gb2312의 데이터를 직접 얻을 수 있습니다.
그러나 mysql 4.1의 출시로 인해 mysql 4.1은 열 수준 문자 집합을 지원하기 때문에 많은 dbadmin에게 많은 문제를 가져왔습니다. 각 테이블과 열은 인코딩을 지정하지
않으면 ISO8895_1이 되므로 jdbc에서 데이터의 경우 모든 데이터를 가져오기 위해 전역 매개변수를 사용하는 대신 문자 집합이 인코딩에 사용됩니다.
이는 문자 깨짐 문제가 정말 복잡하고 이유가 너무 많다는 것을 또 다른 측면에서 보여줍니다. 나는 단지 내가 겪은 실제 상황에 대한 몇 가지 해결책을 제공할 뿐입니다. 만약
실수가
있다면 [email protected] 으로 이메일을 보내주십시오. 나는 허위 사본 대신 마스터 자신의 기사를 더 많이 볼 수 있기를 바랍니다.
내부 전용.
질문이 있으시면 [email protected] 을 참조하십시오.
================================================= ==============
마침내 중국 문제에 대한 가장 완벽한 해결책을 찾았습니다. . . 이 기사의 저자에게 온라인으로 감사드립니다. . .
내 원본 기사는 내 경험을 바탕으로 작성되었습니다. 아무런 문제가 없었지만 문제의 최종 근본 원인은 발견되지 않았습니다. 이 글을 읽고 문득 깨달았습니다. 하하,
————————————————————————————————————————————————— ——————-
Java 프로그래밍의 중국어 문제는 일반적인 문제이기 때문에 저자의 프로그래밍 실습과 결합하여 Java 중국어 문제에 대한 많은 솔루션을 읽은 후 과거에 논의된 많은 방법으로는 문제를 명확하게 설명할 수 없다는 것을 알았습니다. 문제를 해결하고 특히 크로스 플랫폼의 경우 중국 문제를 해결합니다.
그래서 나는 콘솔에서 실행되는 클래스, 서블릿, JSP 및 EJB 클래스의 중국어 문제에 대한 분석과 제안된 솔루션이 포함된 이 기사를 제공했습니다. 나에게 조언을 해주실 수 있기를 바랍니다.
Abstract: 이 글은 자바 프로그래밍에서 자바 컴파일러에 의한 자바 소스 파일과 JVM에 의한 클래스 파일의 인코딩/디코딩 과정을 심층적으로 분석한다. 주어진 자바 중국어 문제를 해결하기 위해 제안된 최적의 방법.
1. 중국어 문제의 원인
컴퓨터의 원래 운영 체제에서 지원하는 인코딩은 단일 바이트 문자 인코딩이므로 처음에는 컴퓨터의 모든 처리 프로그램이 단일 바이트 인코딩으로 영어로 처리되었습니다.
컴퓨터의 발전과 함께 세계 다른 나라의 언어(물론 한자를 포함)에 적응하기 위해 사람들은 더블바이트 인코딩을 사용하고 영어 문자와 호환되는 유니코드 인코딩을 제안했습니다. 따라서 현재 대부분의 국제 소프트웨어는 내부적으로 UNICODE 인코딩을 사용합니다. 소프트웨어가 실행될 때 로컬 지원 시스템(대부분의 경우 운영 체제)에서 기본적으로 지원하는 인코딩 형식을 얻습니다. ), 소프트웨어 내의 UNICODE를 기본적으로 로컬 시스템에서 지원하는 인코딩 형식으로 변환합니다.
여기서 말하는 JDK는 국제화된 JDK 버전을 의미합니다. 다음 JDK는 모두 국제화된 JDK 버전을 의미합니다. 우리의 한자는 컴퓨터가 중국어를 처리할 수 있도록 gb2312, GBK, GBK2K와 같은 자체 표준을 개발하여 컴퓨터 처리 요구 사항을 충족하는 더블 바이트 인코딩 언어입니다.
따라서 중국어 처리 요구 사항에 적응하기 위해 대부분의 운영 체제에는 중국어 운영 체제가 맞춤화되어 있으며 GBK 및 GB2312 인코딩 형식을 사용하여 중국어 문자를 올바르게 표시합니다. 예: 중국어 Windows는 기본적으로 표시를 위해 GBK 인코딩을 사용합니다. 중국어 Windows 2000에서 파일을 저장하는 경우 기본적으로 파일 저장에 사용되는 인코딩 형식도 GBK입니다. 즉, 중국어 Windows 2000에 저장된 모든 파일의 내부 인코딩은 GBK를 사용합니다. 참고: GBK는 GB2312를 기반으로 확장됩니다.
Java 언어는 내부적으로 UNICODE 인코딩을 사용하기 때문에 Java 프로그램 실행 시 운영체제와 브라우저에서 지원하는 해당 인코딩 형식과 입력 및 출력을 변환하는 문제가 있습니다. 이 변환 과정은 일련의 단계를 거칩니다. 단계 중 하나에 오류가 있으면 표시된 중국어 문자가 깨집니다. 이는 일반적인 Java 중국어 문제입니다.
동시에 Java는 크로스 플랫폼 프로그래밍 언어이므로 우리가 작성하는 프로그램은 중국어 창뿐만 아니라 중국어 Linux 및 기타 시스템에서도 실행될 수 있습니다. 우리는 종종 누군가가 중국어 Windows 2000에 작성된 Java 프로그램을 영어 Linux에서 실행하도록 이식하는 것을 봅니다. 이번 이식 수술은 중국 문제도 가져올 것이다.
또한 일부 사람들은 영어 운영 체제와 IE와 같은 영어 브라우저를 사용하여 한자로 프로그램을 실행하고 중국어 웹 페이지를 탐색합니다. 그들은 중국어 자체를 지원하지 않으며 중국어 문제를 일으킬 수도 있습니다.
거의 모든 브라우저는 기본적으로 중국어 인코딩 대신 UTF-8 인코딩 형식으로 매개변수를 전달하므로 중국어 매개변수를 전달할 때도 문제가 발생하여 문자가 깨집니다.
간단히 말해서, 위의 측면은 Java에서 중국어 문제의 주요 원인입니다. 위의 이유로 인해 프로그램이 제대로 실행되지 않아 발생하는 문제를 Java 중국어 문제라고 합니다.
2. Java 인코딩 변환의 세부 프로세스
일반적인 Java 프로그램에는 다음 범주가 포함됩니다
.*콘솔에서 직접 실행되는 클래스(비주얼 인터페이스 클래스 포함)
*JSP 코드 클래스(참고: JSP는 Servlets 클래스의 변형입니다.
) 클래스
* EJB 클래스
* 직접 실행할 수 없는 기타 지원 클래스
이러한 클래스 파일에는 중국어 문자열이 포함될 수 있으며 우리는 종종 JSP를 사용하여 출력 및 입력 문자에 대해 사용자와 직접 상호 작용하는 처음 세 가지 유형의 Java 프로그램을 사용합니다. 서블릿은 클라이언트가 보낸 문자를 가져오며 이러한 문자에는 중국어 문자도 포함됩니다. 이러한 Java 클래스의 역할에 관계없이 이러한 Java 프로그램의 라이프 사이클은 다음과 같습니다.
*프로그래머는 소스 프로그램 코드를 구현하기 위해 특정 운영 체제에서 적합한 편집 소프트웨어를 선택하고 이를 .Java 확장자로 운영 체제에 저장합니다. . 예를 들어, 우리는 중국어 Windows 2000에서 Java 소스 프로그램을 편집하기 위해 메모장을 사용합니다.
*프로그래머는 JDK에서 Javac.exe를 사용하여 이러한 소스 코드를 컴파일하여 .class 클래스를 형성합니다(JSP 파일은 JDK를 호출하는 컨테이너에 의해 컴파일됩니다).
*이러한 클래스를 직접 실행하거나 WEB 컨테이너에 배포하여 실행하고 결과를 출력합니다.
그렇다면 이러한 프로세스 중에 JDK 및 JVM은 이러한 파일을 어떻게 인코딩, 디코딩 및 실행합니까?
여기서는 중국어 Windows 2000 운영 체제를 예로 들어 Java 클래스가 인코딩되고 디코딩되는 방식을 설명합니다.
첫 번째 단계는 메모장과 같은 편집 소프트웨어를 사용하여 중국어 Windows 2000에서 Java 소스 프로그램 파일(위의 5가지 유형의 Java 프로그램 포함)을 작성하는 것입니다. 프로그램 파일을 저장할 때 프로그램 파일은 Windows 2000에서 지원하는 GBK 인코딩 형식을 사용합니다. 기본적으로 운영 체제에서 지원됩니다. 형식은 file.encoding 형식입니다. 즉, Java 프로그램이 컴파일되기 전에 Java 소스 프로그램 파일이 file.encoding에 저장됩니다. 기본적으로 운영 체제에서 지원하는 인코딩 형식입니다. Java 소스 프로그램에는 시스템의 file.encoding 매개변수를 보기 위한 중국어 정보 문자와 영어 프로그램 코드가 포함되어 있으며, 다음 코드를 사용할 수 있습니다.
public class ShowSystemDefaultEncoding
{
공개 정적 무효 메인(문자열[] 인수)
{
문자열 인코딩 =
System.getProperty("file.encoding");
System.out.println(인코딩);
}
}
두 번째 단계에서는 JDK의 Javac.exe 파일을 사용하여 Java 소스 프로그램을 컴파일합니다. JDK는 국제 버전이므로 컴파일할 때 -encoding 매개 변수를 사용하여 Java 소스의 인코딩 형식을 지정하지 않으면 됩니다. 즉, Java 프로그램을 컴파일할 때 소스 프로그램 파일의 인코딩 형식을 지정하지 않으면 JDK는 먼저 file.encoding 매개변수를 얻습니다. (Windows2000과 같은 기본 인코딩 형식을 저장하며 값은 GBK입니다.) JDK는 Java 소스 프로그램을 file.encoding 인코딩 형식에서 Java의 내부 기본 UNICODE 형식으로 변환하여 메모리에 넣습니다.
그러면 Javac는 변환된 유니코드 형식 파일을 .class 클래스 파일로 컴파일하고, 이때 .class 파일은 UNICODE 인코딩되어 임시로 메모리에 배치됩니다. 그런 다음 JDK는 컴파일된 클래스를 UNICODE 인코딩으로 컴파일합니다. 우리가 보는 .class 파일을 형성하기 위해 운영 체제에 저장됩니다.
우리가 최종적으로 얻은 .class 파일은 내용이 UNICODE 인코딩 형식으로 저장된 클래스 파일인데, 소스 프로그램에는 중국어 문자열이 포함되어 있는데 이번에는 file.encoding 형식을 통해 UNICODE 형식으로 변환되었습니다. .
이 단계에서는 JSP 소스 프로그램 파일이 다릅니다. JSP의 경우 프로세스는 다음과 같습니다. 즉, JSP 컴파일러는 먼저 JSP 파일에 파일 인코딩 형식이 설정되어 있는지 확인합니다. JSP 파일에 파일 인코딩 형식이 없습니다. JSP 파일의 인코딩 형식을 설정하기 위해 JSP 컴파일러는 JDK를 호출하여 먼저 JVM의 기본 문자 인코딩 형식(즉, 기본 문자 인코딩 형식)을 사용하여 JSP 파일을 임시 서블릿 클래스로 변환합니다. WEB 컨테이너가 위치한 운영 체제의 file.encoding)을 생성한 후 UNICODE 형식의 클래스로 컴파일하여 임시 폴더에 저장합니다.
예: 중국어 Windows 2000에서 WEB 컨테이너는 JSP 파일을 GBK 인코딩 형식에서 UNICODE 형식으로 변환한 다음 이를 임시로 저장된 Servlet 클래스로 컴파일하여 사용자의 요청에 응답합니다.
세 번째 단계는 두 번째 단계에서 컴파일된 클래스를 실행하는 것으로, 세 가지 상황으로 구분됩니다.
A. 콘솔에서 직접 실행되는 클래스
B. 직접 실행할 수 없는 EJB 클래스 및 지원 클래스(예: JavaBean 클래스)
C. JSP 코드 및 서블릿 클래스
D. Java 프로그램과 데이터베이스 사이
아래에서 네 가지 상황을 살펴보겠습니다.
A. 콘솔에서 직접 실행되는 클래스의 경우
이 클래스를 먼저 실행하려면 JVM 지원이 필요합니다. 즉, 운영 체제에 JRE가 설치되어 있어야 합니다. 실행되는 프로세스는 다음과 같습니다. 먼저 Java는 JVM을 시작합니다. 이때 JVM은 운영 체제에 저장된 클래스 파일을 읽어서 해당 내용을 메모리로 읽어옵니다. 이때 이 클래스가 사용자 입력을 받아야 하는 경우 클래스는 기본적으로 file.encoding 인코딩 형식을 사용하여 사용자가 입력한 문자열을 인코딩하고 이를 유니코드로 변환하여 메모리에 저장합니다. (사용자는 입력 스트림의 인코딩 형식을 설정할 수 있습니다).
프로그램이 실행된 후 생성된 문자열(UNICODE 인코딩)은 JVM에 반환됩니다. 마지막으로 JRE는 문자열을 file.encoding 형식(사용자가 출력 스트림의 인코딩 형식을 설정할 수 있음)으로 변환하고 이를 운영 체제에 전달합니다. 인터페이스를 표시하고 인터페이스로 출력합니다. 위의 각 변환 단계에서는 결국 잘못된 문자가 표시되지 않도록 올바른 인코딩 형식 변환이 필요합니다. B. 직접 실행할 수 없는 EJB 클래스 및 지원 클래스(예: JavaBean 클래스)
직접 실행할 수 없는 EJB 클래스 및 지원 클래스는 일반적으로 입력 및 출력에 대해 사용자와 직접 상호 작용하지 않습니다. 입력 및 출력을 위해 두 번째 단계에서 컴파일된 후 내용이 유니코드 인코딩인 클래스를 형성하고 나중에 해당 클래스와 다른 클래스 간의 상호 작용이 아닌 한 운영 체제에 저장됩니다. 매개변수 전달 프로세스 중에 손실된 경우 올바르게 실행됩니다.
C.
JSP 코드 및 Servlet 클래스의 두 번째 단계 이후 JSP 파일도 Servlet 클래스 파일로 변환되지만 표준 Servlet과 같이 클래스 디렉터리에는 존재하지 않습니다. WEB 컨테이너의 임시 디렉터리에 존재합니다. , 따라서 이 단계에서는 이를 서블릿으로도 살펴보겠습니다.
서블릿의 경우 클라이언트가 요청하면 웹 컨테이너는 서블릿을 실행하기 위해 JVM을 호출합니다. 먼저 JVM은 시스템에서 서블릿 클래스를 읽고 메모리에 인코딩된 서블릿 클래스의 코드를 로드합니다. UNICODE. 그러면 JVM은 메모리에서 Servlet 클래스를 실행합니다. Servlet이 실행 중이면 양식에 입력된 값과 URL에 전달된 값 등의 문자를 받아야 합니다. 프로그램이 수락하도록 설정되지 않은 경우 인코딩 형식이 매개변수로 사용되는 경우 웹 컨테이너는 기본적으로 ISO-8859-1 인코딩 형식을 사용하여 들어오는 값을 수락하고 이를 JVM에서 유니코드 형식으로 변환합니다. WEB 컨테이너의 메모리에 저장합니다.
Servlet이 실행된 후 출력을 생성하고 출력 문자열은 UNICODE 형식입니다. 그런 다음 컨테이너는 Servlet 실행에서 생성된 UNICODE 형식 문자열(예: HTML 구문, 사용자 출력 문자열 등)을 클라이언트에 직접 보냅니다. 이때 전송 시 출력할 인코딩 형식을 사용자가 지정하면 지정된 인코딩 형식으로 브라우저에 출력됩니다. 지정하지 않으면 ISO-8859-로 고객의 브라우저에 전송됩니다. 기본적으로 인코딩은 1개입니다.
D. Java 프로그램과 데이터베이스 간
거의 모든 데이터베이스 JDBC 드라이버의 경우 Java 프로그램과 데이터베이스 간 데이터 전송을 위한 기본 인코딩 형식은 ISO-8859-1입니다. 따라서 우리 프로그램에서는 중국어가 포함된 데이터를 저장할 때 데이터를 데이터베이스로 전송합니다. 프로그램에서 JDBC는 먼저 프로그램 내부의 UNICODE 인코딩 형식으로 된 데이터를 ISO-8859-1 형식으로 변환한 후 이를 데이터베이스에 전달합니다. 데이터베이스에 데이터를 저장할 때 기본값은 ISO-8859-1 저장입니다. 이것이 바로 우리가 데이터베이스에서 자주 읽는 중국 데이터가 왜곡된 이유입니다.
3. 일반적인 Java 중국어 문제를 분석할 때 이해해야 하는 몇 가지 원칙
첫째, 위의 상세한 분석을 통해 Java 프로그램의 수명 주기에서 인코딩 변환의 핵심 프로세스는 다음과 같습니다. 처음에 클래스로 컴파일됩니다. 파일 트랜스코딩 및 최종 트랜스코딩 프로세스가 사용자에게 출력됩니다.
둘째, 컴파일 시 Java에서 지원하는 일반적으로 사용되는 인코딩 형식은*ISO-8859-1, 8비트, 8859_1, ISO-8859-1, ISO_8859_1 및 기타 인코딩과 동일
*Cp1252, 미국식
이라는 점을 이해해야 합니다.
영어 인코딩, ANSI 표준 인코딩과 동일
*UTF-8, 유니코드 인코딩과 동일
*GB2312, gb2312-80, gb2312-1980 및 기타 인코딩과 동일
*GBK, MS936과 동일, gb2312의 확장입니다. 한국어, 일본어, 중국어 번체 등과 같은 기타 인코딩. 동시에 우리는 다음과 같이 이러한 인코딩 간의 호환성 관계에 주의해야 합니다.
유니코드와 UTF-8 인코딩은 일대일 대응을 갖습니다. GB2312는 GBK의 하위 집합으로 간주될 수 있습니다. 즉, GBK 인코딩이 gb2312에서 확장됩니다. 동시에 GBK 인코딩에는 20902개의 한자가 포함되며 인코딩 범위는 0×8140-0xfefe입니다. 모든 문자는 UNICODE2.0에 일대일로 매핑될 수 있습니다.
셋째, 운영 체제에 있는 .Java 소스 프로그램 파일의 경우 컴파일 중에 특히 -encoding을 사용하여 콘텐츠의 인코딩 형식을 지정할 수 있습니다. 참고: 소스 프로그램에 중국어 문자가 포함되어 있고 -encoding을 사용하여 다른 인코딩 문자를 지정하면 분명히 오류가 발생합니다.
-encoding을 사용하여 소스 파일의 인코딩 방법을 GBK 또는 gb2312로 지정합니다. 어떤 시스템에서 중국어 문자가 포함된 Java 소스 프로그램을 컴파일하더라도 문제가 없습니다. 중국어를 UNICODE로 올바르게 변환하여 저장합니다. 클래스 파일.
그런 다음 거의 모든 WEB 컨테이너의 기본 문자 인코딩 형식이 ISO-8859-1을 기본값으로 사용한다는 점을 분명히 해야 합니다. 동시에 거의 모든 브라우저는 매개변수를 전달할 때 기본적으로 UTF-8을 사용합니다. .
따라서 Java 소스 파일이 시작 및 종료 시 올바른 인코딩 방법을 지정하더라도 컨테이너 내부에서 실행될 때 여전히 ISO-8859-1로 처리됩니다.
4. 중국어 문제 분류 및 권장 최적 솔루션
위의 Java 파일 처리 원리를 이해한 후 한자 문제에 대해 제안된 최적 솔루션 집합을 제시할 수 있습니다. 우리의 목표는 중국어 문자열 또는 중국어 처리가 포함된 Java 소스 프로그램을 중국어 시스템에서 편집하여 다른 운영 체제로 마이그레이션하여 컴파일 후 올바르게 실행하거나 다른 운영 체제에서 올바르게 실행하는 것입니다. 중국어 및 영어 매개변수를 전달하고 중국어 및 영어 문자열을 데이터베이스와 올바르게 통신할 수 있습니다. 우리의 구체적인 아이디어는 Java 프로그램 트랜스코딩의 시작과 종료 및 Java 프로그램이 사용자와 입력 및 출력 변환을 수행하는 위치에서 인코딩 방법을 올바르게 제한하는 것입니다.
구체적인 해결 방법은 다음과 같습니다.
1. 콘솔에서 직접 실행되는 클래스의 경우
, 이 경우 프로그램 작성 시 중국어가 포함될 수 있는 사용자로부터 입력을 받거나 중국어가 포함될 수 있는 출력을 받아야 하는 경우, 프로그램은 입력 및 출력을 처리하는 데 사용되는 문자 스트림을 사용해야 합니다. 특히 다음과 같은 문자 지향 노드 스트림 유형이 적용됩니다.
파일의 경우: FileReader, FileWrieter,
해당 바이트 지향 노드 스트림 유형은 다음과 같습니다. FileInputStream, FileOutputStream
메모리의 경우(배열 ): CharArrayReader,
CharArrayWriter 노드 스트림 유형은: ByteArrayInputStream, ByteArrayOutputStream.
메모리
(문자열): StringReader, PipedWriter.
바이트
노드 스트림 유형은: PipedInputStream, PipedOutputStream.
입력 및 출력 지향적인 처리 스트림을 사용해야 합니다.
BufferedWriter, BufferedReader,
해당 바이트 유형 처리 스트림은 BufferedInputeStream, BufferedOutputStream
InputStreamReader, OutputStreamWriter,
해당 바이트 유형 처리 스트림은 DataInputStream, DataOutputStream
및 InputStreamWriter
입니다. 지정된 문자 인코딩 세트에 따른 바이트 스트림다음
과 같이 문자 스트림으로 변환합니다.
예: 다음 샘플 Java 인코딩은 요구 사항을 충족할 수 있습니다.
//Read.Java
Java.io.* 가져오기;
공개 수업 읽기
{
공개 정적 무효 메인(문자열[] 인수)
IO예외가 발생합니다.
{
문자열 str =
"n중국어 테스트, 내부 하드 코딩된 문자열 "+"n테스트 영어 문자입니다.";
문자열 문자열 = "";
BufferedReader 표준 입력 =
새로운 BufferedReader(새로운
InputStreamReader(System.in,”gb2312″));
//입력 인터페이스를 중국어로 인코딩되도록 설정
BufferedWriter 표준 출력 =
새로운 BufferedWriter(새
OutputStreamWriter(System.out,”gb2312″));
//출력 인터페이스를 중국어로 인코딩되도록 설정
stdout.write("입력하세요:");
stdout.flush();
strin = stdin.readLine();
stdout.write("사용자가 입력한 문자열입니다:"+strin);
stdout.write(str);
stdout.flush();
}}
동시에 프로그램을 컴파일할 때 다음 방법을 사용합니다.
Javac -encoding gb2312 Read.Java
2. 직접 실행할 수 없는 EJB 클래스 및 지원 클래스(예: JavaBean 클래스)의
경우 이러한 클래스 자체가 다른 클래스에서 사용됩니다. 호출은 사용자와 직접 상호 작용하지 않으므로 이 유형의 경우 권장되는 처리 방법은 내부 프로그램이 문자 스트림을 사용하여 프로그램 내부의 중국어 문자열을 처리해야 한다는 것입니다(구체적으로 위 섹션에서와 같이). 동시에 클래스를 컴파일할 때 -encoding gb2312 매개변수를 사용하여 소스 파일이 중국어 형식으로 인코딩되었음을 나타냅니다.
3. Servlet 클래스의 경우
다음 방법을 권장합니다.
Servlet 클래스의 소스 프로그램을 컴파일할 때 -encoding을 사용하여 인코딩을 GBK 또는 GB2312로 지정하고 인코딩에서 응답 객체의 setContentType("text"를 사용합니다. 사용자에게 출력할 때 /html;charset=GBK”); 또는 gb2312를 사용하여 출력 인코딩 형식을 설정합니다. 마찬가지로 사용자 입력을 받을 때 어떤 운영 체제에 관계없이 request.setCharacterEncoding(”GB2312″)을 사용합니다. 우리 서블릿 클래스는 클라이언트에만 이식됩니다. 브라우저가 중국어 디스플레이를 지원하면 올바르게 표시됩니다. 올바른 예는 다음과 같습니다.
//HelloWorld.Java
패키지 안녕하세요;
Java.io.* 가져오기;
import Javax.servlet.*;
import Javax.servlet.http.*;
공개 클래스 HelloWorld
HttpServlet 확장
{
공개 무효 초기화()
ServletException이 발생합니다.
{
}
공공 무효 doGet
(HttpServletRequest 요청,
HttpServletResponse 응답)
IOException, ServletException 발생
{
request.setCharacterEncoding("GB2312");
//입력 인코딩 형식 설정
response.setContentType
("text/html;charset=GB2312");
//출력 인코딩 형식 설정
PrintWriter 출력 = response.getWriter();
//PrintWriter 출력을 사용하는 것이 좋습니다.
out.println("<시간>");
out.println("안녕하세요!
이것은 Servlet!Test Chinese에 의해 생성되었습니다!");
out.println("<시간>");
}
공개 무효 doPost(HttpServletRequest 요청,
HttpServletResponse 응답)
IOException, ServletException 발생
{
request.setCharacterEncoding("GB2312");
//입력 인코딩 형식 설정
response.setContentType
("text/html;charset=GB2312");
//출력 인코딩 형식 설정
문자열 이름 = request.getParameter("name");
String id = request.getParameter("id");
if(name==null) 이름="";
if(id==null) id="";
PrintWriter 출력 = response.getWriter();
//PrintWriter 출력을 사용하는 것이 좋습니다.
out.println("<시간>");
out.println("전달한 중국어 문자열은 다음과 같습니다: " + name);
out.println("<hr>입력한 ID는 " + id);
out.println("<시간>");
}
공공 무효 파괴()
{
}
}
이 프로그램을 컴파일하려면 Javac -encoding gb2312 HelloWorld.Java를 사용하십시오.
이 서블릿을 테스트하는 프로그램은 다음과 같습니다.
< %@page contentType="text/html;
문자셋=gb2312″%>
<%request.setCharacterEncoding("GB2312");%>
<html><머리><제목></제목>
<스크립트 언어="자바스크립트">
함수 제출()
{
//URL을 통해 중국어 문자열 값을 서블릿에 전달합니다.
document.base.action =
"./HelloWorld?name=중국어";
document.base.method = “포스트”;
document.base.submit();
}
</스크립트>
</head>
<body bgcolor=”#FFFFFF”
텍스트=”#000000″ 상단여백=”5″>
<양식 이름="기본" 방법 =
“POST” 대상=”_self”>
<입력 이름="ID" 유형="텍스트"
값=”” 크기=”30″>
<a href = “자바스크립트:제출()">
서블릿으로 전달</a>
</form></body></html>
4.
Java 프로그램과 데이터베이스 간의 데이터 전송 시 데이터 왜곡을 방지하기 위해 다음과 같은 최적의 처리 방법을 권장합니다.
1. Java 프로그램은 당사가 지정한 방법에 따라 처리되어야 합니다.
2. 데이터베이스에서 기본적으로 지원하는 인코딩 형식을 GBK 또는 GB2312로 변경합니다.
예를 들어, mysql에서는 이를 달성하기 위해 구성 파일 my.ini에 다음 명령문을 추가할 수 있습니다.
[mysqld] 영역에
default-character-set=gbk를
추가하고[client]
를 추가합니다.
default-character-set=gbk
SQL Server2K에서는 목적을 달성하기 위해 데이터베이스의 기본 언어를 중국어 간체로 설정할 수 있습니다.
5. JSP 코드의 경우
JSP는 런타임 시 WEB 컨테이너에 의해 동적으로 컴파일되므로 JSP 소스 파일의 인코딩 형식을 지정하지 않으면 JSP 컴파일러는 서버 운영 체제의 file.encoding 값을 가져와서 컴파일합니다. 예, 이식할 때 문제가 발생할 가능성이 높습니다. 예를 들어 중국어 Windows 2000에서 잘 실행되는 jsp 파일은 클라이언트가 동일하더라도 영어 Linux에서는 작동하지 않습니다. 운영 체제의 인코딩이 다르기 때문에 발생합니다.(중국어 윙크의 file.encoding은 영어 Linux의 file.encoding과 다르며 영어 Linux의 file.encoding은 중국어를 지원하지 않으므로 문제가 발생합니다. 컴파일된 JSP 클래스).
인터넷에서 논의되는 대부분의 문제는 이러한 문제인데, 대부분 JSP 파일을 플랫폼에 이식할 때 올바르게 표시할 수 없기 때문입니다. 이런 종류의 문제에 대해 우리는 Java의 프로그램 인코딩 변환 원리를 이해하고 훨씬 더 쉽습니다. 그것을 해결하십시오. 우리가 제안하는 해결책은 다음과 같습니다.
1. 클라이언트에 출력할 때 JSP가 중국어 인코딩으로 출력되는지 확인해야 합니다. 즉, 무슨 일이 있어도 먼저 JSP 소스 코드에 다음 줄을 추가합니다.
< %@page contentType =” 텍스트/html;
charset=gb2312″%>
2. JSP가 들어오는 매개변수를 올바르게 얻을 수 있도록 JSP 소스 파일 헤더에 다음 문장을 추가합니다.
<%request.setCharacterEncoding(”GB2312″);
%>
3. JSP 컴파일러가 한자가 포함 된 JSP 파일을 올바르게 디코딩하려면 JSP 소스 파일에서 JSP 소스 파일의 인코딩 형식을 지정해야합니다. JSP 소스 파일 헤더의 소스 파일은 다음 문장을 추가하십시오.
< %@ pageencoding =”gb2312 ″ %>
또는 < %@ pageencoding = "gbk" %>
이것은 JSP 사양 2.0에 새로 추가 된 지침입니다.
이 방법을 사용하여 JSP 파일에서 중국어 문제를 해결하는 것이 좋습니다. 다음 코드는 JSP 파일에 대한 올바른 테스트 프로그램입니다
.
< %@page pageencoding =”gb2312 ″ %>
< %@page contenttype = "text/html;
charset = gb2312 ″%>
<%request.setcharacterencoding ( "gb2312");
%>
<%
문자열 action = request.getParameter ( "action");
문자열 이름 = "";
문자열 str = "";
if (action! = null && action.equals ( "send"))
{
이름 = request.getParameter ( "이름");
str = request.getParameter ( "str");
}
%>
<html>
<머리>
<제목></제목>
<script language = "javaScript">
함수 제출 ()
{
document.base.action =
"? action = send & str = 들어오는 중국어";
document.base.method =“post”;
document.base.submit ();
}
</스크립트>
</head>
<바디 bgcolor =”#ffffff”
텍스트 =”#000000 ″ TopMargin =”5 ″>
<form name = "base"method =
"post"target = "_ self">
<입력 유형 =”텍스트”이름 =”이름”
value =””size =”30 ″>
<a href =“javaScript : 제출 () "> 제출 </a>
</form>
<%
if (action! = null && action.equals ( "send"))
{
out.println ( "<br> 입력 한 문자는 다음과 같습니다."+name);
out.println ( "<br> URL을 통해 전달한 문자는 다음과 같습니다."+str);
}
%>
</body>
</html>