2009-10-08 4 views
2

MySQL에서 Linux 기반 C++ 응용 프로그램으로 검색 한 UTF-8 데이터 표시에 큰 문제가 있습니다. UTF 텍스트는 물음표로 표시됩니다.MySQL에서 Linux C++ 응용 프로그램으로 UTF-8 데이터 가져 오기

응용 프로그램은 MySQL C API를 사용합니다. 그래서 mysql_init() 후 UTF-8 옵션을 통과 mysql_real_connect() 전에 :

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8'); 

mysql_options(&mysql,MYSQL_INIT_COMMAND, 'SET NAMES utf8'); 

그러나 운이없는

을. 테스트는 여전히 물음표로 표시됩니다. 필자는 펄 스크립트로 몇 가지 테스트를 수행했다.

$dbh->{'mysql_enable_utf8'} = 1; 
$dbh->do('SET NAMES utf8'); 

모든 아이디어를 어떻게 정확하게 C++ 응용 프로그램에서 UTF-8 데이터를 표시 : 나는 연결에 대한 UTF-8 옵션을 지정하면 텍스트가 올바르게 표시됩니다?

+1

데이터를 검색하고 표시하는 방법은 무엇입니까? 어떤 기능과 데이터 유형이 관련되어 있습니까? – Darryl

답변

3

원하는 결과를 얻으려면 charset 옵션을 설정할 필요가 없습니다. 그들은 단지 DB가 정렬 등으로 합리적인 일을하도록 도와줍니다.

실제로 데이터를 UTF-8 형식으로 받고 있지만 올바르게 처리하지 못하는 것 같습니다. UTF-8을 C 언어로 전달하는 것이 세계에서 가장 쉬운 방법입니다. 올바르게 출력하는 것은 더 많은 어려움이 될 수 있지만 물론 MySQL의 문제는 아닙니다.

이 게시물의 태그를 기반으로,이 프로그램을 Linux에서 실행 중이라고 가정합니다. 그렇다면 리눅스 콘솔이 요즘 거의 대부분 UTF-8로 기본 설정되어 있기 때문에 콘솔 (printf(), cout, 뭐든간에)에 올바른 표현을 얻기 위해 출력 할 수 있어야합니다. LANG 환경 변수를 점검하십시오.

유니 코드를 다룰 때 매우 적은 양의 비 ASCII 데이터를 얻는 테스트 프로그램을 작성하는 것이 좋습니다. 한 문자 만 사용하는 것이 좋으며이 프로그램의 출력을 파일. 그런 다음 16 진수 편집기에서 파일을보고 적어도 UCS-2LE와 비교하여 잘못된 인코딩을보고 있는지 확인하십시오.

나는 메인테이너가 MySQL++이며, MySQL ++가 리눅스에서 UTF-8을 아주 자연스럽게 처리한다고 말할 수있다. 그러나 우리는 그것을하기 위해 어떤 게임도하지 않는다. 왜 똑 바른 C API 코드가 자연스럽게 행동하지 않아야하는지 모르겠습니다. UTF-8 테스트가 포함되어 있으므로 시스템에 MySQL ++을 빌드하고 예제를 실행 해보십시오. resetdb를 실행하여 결과를 설정 한 다음 simple1을 사용하여 resetdb가 테스트 DB에 입력 한 UTF-8 데이터를 표시합니다. 자세한 내용은 배포판의 README-examples.txt를 참조하십시오.

MySQL ++로 전환 할 것을 말하는 것이 아니며 단지 알려진 테스트로 사용하는 것입니다. 일단 작동 시키면 DB에 대해 작동하도록 예제를 수정하거나 손상 여부를 확인할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 워렌. UTF8 데이터를 C++ 응용 프로그램에 올바르게 표시하는 방법을 이미 찾았습니다. 방금 my.cnf에서 이러한 옵션을 설정했습니다 :

 [mysqld] init_connect='SET NAMES utf8; SET collation_connection = utf8_general_ci;' default-character-set=utf8 character-set-server=utf8 collation-server=utf8_general_ci skip-character-set-client-handshake 
그리고 도움이 :) – michael

+0

나는 그 행동을 얻을 수있는 방법을 생각 : 테이블의 기본 문자 집합이 UTF-8이 아닌 경우. 이 경우 수행 한 작업은 모든 액세스시 변환을 강제하는 것입니다. 천천히 그리고 무거워. UTF-8로 데이터를 저장하는 것이 더 좋습니다. –

6

단순한 오타가 될 수 있습니다. 당신은 다음과 같이 씁니다 :

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8'); 

작은 따옴표는 문자열이 아닌 문자 리터럴을 지정하기위한 것입니다. 따라서 다음과 같이 변경하십시오.

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8"); 

또한 mysql 유형을 확인하십시오.이 MYSQL * 경우, 쓰기 :

mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8"); 

같은이 MYSQL_INIT_COMMAND으로 라인에 적용됩니다.

+0

큰 감사합니다! 이 mysql_set_character_set (myData, "utf8");은 나를 위해 작동하지 않습니다. 당신의 코드'mysql_options (myData, MYSQL_SET_CHARSET_NAME, "utf8");은 잘 작동합니다! – David

관련 문제