2012-06-29 1 views
2

이 질문은 MySQL (5.5.16) 데이터베이스에 연결된 Tomcat 7 웹 응용 프로그램과 관련이 있습니다. 나는 zip 파일을 열 때zip 파일의 파일 이름에서 파생 된 특수 문자로 작업

, 즉 windows-1252 캐릭터 세트로 인코딩 된 파일 이름을 가지고, 문자는 자바 올바르게 해석하는 것 : 예외가 발생 것 ZipFile를 생성자에서 charset 오브젝트를 생략

ZipFile zf = new ZipFile(zipFile, Charset.forName("windows-1252")); 
Enumeration entries = zf.entries(); 
while(entries.hasMoreElements()) { 
    ZipEntry ze = (ZipEntry) entries.nextElement(); 
    if(! ze.isDirectory()) { 
     String name = ze.getName(); 
     System.out.println(name); //prints correct filenames, e.g. café.pdf 
    } 
} 

. zip 파일의 파일 이름은 발음 구별 기호를 포함하여 표준 출력으로 올바르게 인쇄됩니다. 그러나 데이터베이스에 파일 이름을 저장하려고 시도하면 e-acute가 물음표로 바뀝니다 (mysql 콘솔 클라이언트에서 볼 수 있듯이). 이전에 웹 응용 프로그램의 특수 문자를 MySQL에 삽입하는 데 문제가 없었습니다. 나는 자바 소스 코드에서 é과 INSERT를 실행하면

는 :

statement.executeUpdate("insert into files (filename) values ('café.pdf')"); 

é는 MySQL의에서 잘 나타납니다.

또한, 내 로그 파일 대신

사람이 여기 일이있을 수 있는지 알고 있나요 é: caf‚.pfd의 쉼표를 보여줍니다?

당신은 데이터를 저장하는 테이블에서
+0

MySQL 서버에 대한 연결을 어떻게 열지 않습니까? 어떤 수업/도서관/서비스를 사용합니까? – SkyDan

+0

Java로 MySQL을 연결하려면 driverClassName = "com.mysql.jdbc.Driver"url = "jdbc : mysql : // localhost : 3306/workflow? zeroDateTimeBehavior = convertToNull" – reus

+0

과 함께 javax.sql.DataSource 자원을 사용하십시오. Java 응용 프로그램에서 다음 쿼리를 실행하십시오. 라틴 character_set_connection을 - - 라틴 character_set_database - 라틴 character_set_filesystem - 바이너리 character_set_result - character_set_server - 라틴 character_set_system 해서 character_set_client : '숯불 %'' '문자 %'출력과 같은 – SkyDan

답변

0

문제가 해결되었습니다. This postzip 파일의 파일 이름 인코딩이 windows-1252이 아니라 IBM437 일 수 있음을 제안했습니다.변경 Charset에서 :

ZipFile zf = new ZipFile(zipFile, Charset.forName("windows-1252")); 

ZipFile zf = new ZipFile(zipFile, Charset.forName("IBM437")); 

에 원하는 결과 준 : MySQL의에서 획득 한 파일 이름을 저장할 때와, 제대로 저장된을 피보호자 ;.

무엇이 잘못 되었나요?

내가 잘못 zip 파일의 파일 이름이 잘 해석 한 가정 만든

System.out.println(name); 

으로 표준 출력에 zip 파일에 포함 된 파일 이름을 인쇄 : 나는 zip 파일을 열 수 windows-1252 인코딩을 사용하는 경우, 파일 이름은 구별 부호 (dacritic : caf & acute; .pdf)로 표준 출력에 잘 인쇄되었습니다. 다른 문자 인코딩을 사용하면 & eacute; 대신 다른 기호가 나타납니다.

그러나 피보호자의 Unicode 값을 인쇄 할 때 - this answer의 도움으로 char을, 나는 windows-1252 인코딩 zip 파일을 열 때, 실제 유니 코드 값이 NOT \u00e9 (라틴어 소문자 전자와 것을 볼 수 있었다 급성), 그러나 \u201a (작은 따옴표 9). 을 IBM437 charset으로 열면 올바른 유니 코드 값 DID가 나타납니다.

StringPrintStream으로 표준 출력에 인쇄 할 때 물론 PrintStream도 특정 문자 인코딩과 관련됩니다. PrintStream에서 Javadoc :

PrintStream에서 인쇄 된 모든 문자는 플랫폼의 기본 문자 인코딩을 사용하여 바이트로 변환됩니다.

저는 Windows XP에서 작업하고 있습니다. 나는 새로운 PrintStream

out = new PrintStream(System.out, true, "IBM437"); 

모든 만든 감각 만들 때 : IBM437 문자 인코딩을 가진 zip 파일을 열고, 새의 PrintStream를 사용하여, 피보호자를; 제대로 인쇄되었습니다.

There Ain't No Such Thing As Plain Text.

0

, 당신은 전자 급성 문자

+0

그는 직접 쿼리가 성공했다고 말했습니다. 즉, 모든 것이 서버 측에서 올바르게 수행됩니다. – SkyDan

1

당신은 코멘트 섹션에서 언급 한 바와 같이, 수신 데이터 (압축 파일의 이름을 저장 할 수 있도록 올바른 정렬을 사용하십시오)는 와 다를 수 있습니다. 문자 집합입니다. 이것은 MySQL + JDBC 링크를 사용하기 때문에 당신에게 문제가 될 것이고, MySQL의 컬럼 당 하나의 문자 세트와 JDBC의 연결 당 하나의 문자 세트와 같은 많은 제한 사항을 제공합니다.

그러므로 MySQL 측에서 문자 집합을 (예 : character_set_servercharacter_set_connection과 같은 변수를 찾으십시오) UTF8로 전환하는 것이 좋습니다. 사용자가받을 수있는 거의 모든 문자를 전송하고 저장할 수 있기 때문입니다. MySQL 서버를 올바르게 설정하는 방법은 here을 참조하십시오. 이 설정은 MySQL 서버가 어려울 수 있으므로 PM에게 추가적인 도움을 주저하지 마십시오. JDBC는 자동으로 서버의 character_set_connection 변수에 맞게 조정되므로 Java 응용 프로그램에서 아무 것도 변경할 필요가 없습니다.

응용 프로그램에서 변경해야 할 사항 중 하나는 들어오는 모든 데이터를 보내고 MySQL 서버에 저장하려면 UTF8로 변환해야한다는 것입니다.

행운을 비네.