2016-08-03 5 views
-2

이름 표시시 문제가 발생합니다. 내 응용 프로그램은 PHP, Perl 및 BI Pentaho에 대해 서로 다른 기술을 사용합니다.값을 UTF-8로 변환 할 때의 문제

우리는 DB로 MYSQL을 사용하고 나의 테이블은 CHARSET=utf8입니다.

내 테이블은

Row1 = Ãx—350 
Row2 = Ñz–401 

PHP와 펄이 DB에 저장되어있는 위의 값을 변환하는 내장 기능에 다른를 사용하는 잘못되는 아래와 같은 행에 값으로 저장되어 있으며이 UI에 표시됩니다

이는 다음과 같이 내가 보고서에 데이터를 표시하기 전에 데이터를 변환하는 ETL을 사용하고 펜타을 사용하는 보고서에 오는

Expected Row1 = Áx—350 
Expected Row2 = Ñz–401 

올바른 것입니다. 는 위의 2 개 잘못된 값 사이에서 제대로 값을 변환하지 않는 내가

new java.lang.String(new java.lang.String(CODE).getBytes("Windows-1252"), "UTF-8") 

다음과 같이 자바 단계를 통해 데이터를 변환하려고 위의 DB 저장 값을 변환 그러나하기 위해 단지 행 2 값이되어있다 제대로 변환하지만 첫 번째 ROW1 잘못 다음과 같이 변환됩니다

Converted Row1 = �?x—350 
Converted Row2 = Ñz–401 

예를 들어 ROW1 값이 적절한 변환해야합니다 있도록 내가 제대로 값을 변환 할 수있는 방법을 제안하십시오 ~ Áx-350.

은 내가 AXA € "350 문자열 AX-350

String input = "Ãx—350"; 
byte[] b1 = input.getBytes("Windows-1252"); 
System.out.println("Input Get Bytes = "+b1.toString()); 

String szUT8 = new String(b1, "UTF-8"); 
System.out.println("Input Encoded = " + szUT8); 

을 위의 코드의 출력은 다음과 같습니다 변환 아래 작은 자바 프로그램을 작성

Input Get Bytes = [[email protected] 
Input Encoded = �?x—350-350—É1 

출력을 보면 실제 예상 출력이 Áx-350 인 문자열이 잘못되었습니다.

부호화/복호화 방식에 제가 테스트 문자열 online 시도 문자열 악사 € "350 시험 출력이 정확한지 AX-350 예상 될 때를 확인한다.

그래서 자바 코드가 올바르게 인코딩/디코딩 스키마를 사용하고 있지만, 자바 코드가 제대로 변환되지 않는 것을 지적하십시오. 누락 된 항목이나 내 접근 방식이 잘못되었습니다.

+0

실제 기대 값은 무엇입니까? "α-350"? UTF-8을 올바르게 처리하지 못합니다. 먼저 http://stackoverflow.com/q/279170/476과 [웹 응용 프로그램에서 유니 코드 앞뒤로 처리하기] (http://kunststube.net/frontback/)를 참조하십시오. – deceze

+0

감사합니다 @deceze, 예 예상 값은 Áx-350 – Yog

+1

당신이 변환하는 데 사용하는 코드는 JavaScript가 아니고 Java입니까? – beasy

답변

0

db가 utf-8로 설정되어 있다고해서 반드시 거기에있는 데이터가 utf-8 (또는 utf-8)로 올바르게 인코딩되었음을 의미하지는 않습니다. mojibake - 한 번에 잘못된 인코딩 체계를 사용하여 디코딩 된 문자가 차례로 잘못 인코딩 된 것처럼 보입니다. 수정은 일반적으로 과거의 디코드/인코딩 오류를 파악한 다음 취소하는 일반적으로 지루한 과정입니다.

짧은 이야기 : 당신이 mojibake를 사용하면 과거에 어떤 전환이 있었는지 알지 못하거나 (알아낼 수없는 경우) 수행 할 수있는 자동 전환이 없습니다.

변환은 첫 번째 디코딩과 인코딩의 문제입니다. 변환하는 펄 :

my $string = "some windows-1252 string"; 

use Encode; 
my $raw = decode('windows-1252',$string); 
my $encoded = encode('utf-8',$raw); 
+0

감사합니다, 인코딩 및 디코딩 스키마를 확인하고이 [link] (http : // string -functions.com/encodedecode.aspx) 인코딩 할 때 ** â € "350 문자열로 인코딩/디코딩 **로 ** Windows-1252 **로 인코딩하고 ** utf-8로 결과로 디코딩 ** 결과는 정확합니다 is ** Áx-350 ** 그래서 새로운 java.lang.String (새로운 java.lang.String (CODE) .getBytes ("Windows-1252"), "UTF-8") '인코딩 및 디코딩 같은 시도로 나는 원하는 결과를 얻지 못하고있다. 어떤 제안? – Yog

+0

Java가 잘 모르지만 Java 명령이 문자열을 두 번 인코딩한다고 확신합니다. 결코 해독되지 않습니다. Perl에서 디코드 및 인코딩하는 방법을 보여줄 내 대답을 편집하고 있습니다. – beasy

관련 문제