2009-06-11 6 views
11

delicious-to-wp perl script은 작동하지만 모든 이상한 문자에 대해서는 더 이상 출력하지 않습니다. 그래서 나는 Perl의 DBI로 유니 코드를 처리하려면 어떻게해야합니까?

$description = decode_utf8($description); 

을 시도하지만 나던 차이를 확인하십시오. 예 : "살다"가 아닌 "살다"가 되려면 살아라 "살아라"- 어떻게 작동 하는가? Perl에서 유니 코드를 처리 할 수 ​​있습니까?

업데이트 : 나는 문제가 내가 Perl로 설정했다 DBI의 UTF을 설정하는 것이었다 발견 : 나는 까다로운 설정했던 부분이었다

my $sql = qq{SET NAMES 'utf8';}; 
$dbh->do($sql); 

. 감사!

+0

여전히 문제를 나타내는 가능한 가장 짧은 스크립트로 코드를 압축하십시오. 방정식에서 데이터베이스를 가져 와서 문제가 Perl과 관련이 있는지 알아보십시오. 다른 사람들이 테스트하고 디버그 할 수있는 것을 생각해 내십시오. –

답변

3

Perl과 아무 관련이 없습니다. 관련 MySQL 테이블 열에서 UTF 인코딩을 사용하고 있는지 확인하십시오.

+0

테이블은 UTF로되어 있었지만 Perl의 DBI에 세트 이름을 추가해야했습니다 ... – edelwater

17

충분히 새로운 DBD :: mysql 버전 (3.0008)을 실행하고 있다면 다음을 수행 할 수 있습니다. $dbh->{'mysql_enable_utf8'} = 1; 그리고 나서 모든 항목의 decode() ed/encode()가 밖으로 /에서 DBI 방법.

+5

나 자신과 같은 게으른 분들은 dbic 변종입니다 : Schema> connect ("dbi : mysql :". $ db { db}, $ db {user}, $ db {pass}, {mysql_enable_utf8 => 1}); –

+0

해결책은 해결책이 아니지만 위의 주석에서 @al로 해결하십시오. 매력처럼 작동합니다. –

3

확실히 당신 의 DB는 것에서 obatined 데이터를 어떤 펄 처리를 수행하려는 경우, 통지으로 데리고 UTF-8 선언 데이터베이스에 액세스하기위한 일을 저장하지만

$dbh->do(qq{SET NAMES 'utf8';}); 

용어 이 작업이 암시 적이 아니기 때문에 perl var에 utf8 문자열로 저장하는 것이 현명합니다. 물론

$utfstring = decode('utf8',$string_from_db); 

는 적당한 I위한/UTF8 문자열 (판독, 인쇄 출력에 기록)의 오 취급

use open ':utf8'; 

binmode STDOUT, ":utf8"; 

후자 필수 인 설정 기억 utf8 문자열을 인쇄합니다. 희망이 도움이됩니다.

+0

디코딩 기능을 얻는 방법? Perl은 decode() 루틴을 찾을 수 없다는 오류를 보여줍니다. 감사! – Arsenii

+0

이건 내 문제가 해결되었습니다 ... XHR을 사용하여 JSON 문자열을 클라이언트에 반환하는 Postgres utf-8 데이터베이스에 연결하는 perl cgi 스크립트가 있어야합니다. 문자'my $ final_utf8 = Encode :: encode_utf8 ($ treeJSON);을 추가 할 때까지 문자가 클라이언트 측에서 모두 표시됩니다. CGI-> header ('application/json; charset = UTF-8')를 출력하십시오; "$ final_utf8";을 (를) 귀하의 게시물에 제안대로 인쇄하십시오. 이것을 사용하려면 perl 스크립트의 맨 위에'Use Encode; '가 필요하다는 것을 기억하십시오. – GoinOff

1

이 하나를 남겨 :

binmode STDOUT, ":utf8"; 

사용하는 경우 :

$dbh->do(qq{SET NAMES 'utf8';}); 

이 그렇지 않으면 출력이 이중 UTF8 인코딩을해야합니다, 읽을 수없는 2 바이트 문자의 결과! 그것은이를 알아 내기 위해 나에게 몇 시간을했다 ..

+0

당신이 말한 것이 사실이라면 Perl은 데이터베이스에서 검색된 데이터가 UTF-8로 인코딩되었고 단순히 바이트라고 생각한다는 것을 모릅니다. 확실하게 DBD :: Mysql (또는 당신이 사용하고있는 DBD가 무엇이든)은 데이터베이스에서 데이터를 해독하여 Perl이 유니 코드 문자를 알고 있어야하며 utf8 레이어로 stdout에 쓸 때 모두 잘 될 것입니다. 당신이 설명하는 것이 무슨 일이 일어나면 당신의 DBD가 고장 났다고 제안 할 것입니다. 그러나 최신 DBD :: MySQL을 보면 "sv_utf8_decode (sv);" 적어도 일부 데이터. – bohica

+0

bohica, DBD :: mysql은 일반적으로 바이트를 제공하며 [암시 적 디코딩] (http://p3rl.org/DBD::mysql#mysql_enable_utf8)은 기본적으로 켜져 있지 않습니다. – daxim

11

이 같은 데이터베이스에 연결할 때, UTF8을 사용 :

my $dbh = DBI->connect(
    "dbi:mysql:dbname=db_name", 
    "db_user", "db_pass", 
    {RaiseError => 0, PrintError => 0, mysql_enable_utf8 => 1} 
) or die "Connect to database failed."; 

이 필요에 따라 설정 UTF8 플래그를 사용하면 문자 모드 문자열을 얻어야한다 . DBI General Interface Rules & Caveats에서

: 유니 코드 (내부적으로 UTF8)와 비 유니 코드 (인코딩을 가정하도록 강요하는 경우 ISO-8859-1 기본값) :

펄은 문자열 두 가지를 지원합니다.드라이버는 두 종류의 문자열을 모두 받아 들여야하며 필요한 경우 사용중인 데이터베이스의 문자 집합으로 변환해야합니다. 비슷하게 iso-8859-1이 아닌 데이터베이스 문자 데이터를 가져올 때 드라이버는이를 utf8로 변환해야합니다.

그리고 또한 mysql_enable_utf8

에 대한 DBD::mysql의 특성은,이 플래그를 켜면 들어오는 데이터가 UTF-8로 취급해야한다는 MySQL을 알려줍니다. connect() 호출의 일부로 사용되는 경우에만 적용됩니다. 연결 후 플래그를 켜면 동일한 효과를 얻으려면 SET NAMES utf8 명령을 실행해야합니다.

0

기본적으로 Perl/MySQL 드라이버는 바이너리 데이터를 처리합니다 (적어도 필자는 MySQL 5.1 및 5.5의 일부 실험에서이를 결론지었습니다).

mysql_enable_utf8을 설정하지 않고 데이터베이스에 쓰기/읽기 전에 문자열을 UTF-8로 인코딩/디코딩했습니다.

바이트 배열로 perl 내부 문자열 표현에 의존해서는 안됩니다. 내부 'utf8'은 표준 UTF-8로 보장되지 않습니다. 반대로, 단일 바이트 인코딩은 ISO-8859-1로 보장되지 않습니다. 실제로는 UTF-8 (및 'utf8')이 아닌 /에서 인코딩/해독을 수행합니다.

MySQL의 일부 설정 (위의 SET NAME과 같이 클라이언트 인코딩, 연결 인코딩 및 서버 인코딩이 있다는 것을 기억하는 한 모두가 상호 작용이 명확하지 않은 경우) 인코딩과 관련하여 동일한 값을 가짐); 그들 모두를 UTF-8로 설정하고, 위의 조리법은 나를 위해 일했습니다.

관련 문제