문제

인코딩에 관해서는 너무 좋지 않으며 데이터를 다시 인코딩하는 것과 같은 데이터를 반환하는 방법을 알아 내고 싶습니다 ...

나는 다음과 같은 문자가있는 파일이 있습니다. '»' 편집하고 데이터베이스에 삽입 할 때까지 그들은 â»로 바뀌 었습니다.

decode_entities ()는 아무것도하지 않고 encode_entities는 숯을 다시 인코딩합니다. 그래서 나는 그것을 고치기 위해 내 자신의 서브를 만들었지 만 파일에서 데이터를 얻을 때 올바른 형식으로 검색되지 않는다는 점이 있습니다.

my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php";
{
    local( $/ ); # undefine the record seperator
    open FILE, "<", $file or die "Cannot open:$!\n";
    my $fileContents = unicodeConvert(<FILE>);
    ...
    .. 

인코딩 옵션이 없습니까?

my $file = "c:/perlscripts/" . md5_hex($md5Con) . "-code.php";
{
    local( $/ ); # undefine the record seperator
    open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";
    my $fileContents = unicodeConvert(<FILE>);
    ...
    .. 

그리고 내 서브는;

sub unicodeConvert($) {
   my $str = shift;
    my %entityRef = ("&" => "&amp;", '¢' => "&cent;", '¤' => "&curren;", '¦' => "&brvbar;", '¨' => "&uml;", 'ª' => "&ordf;", '¬' => "&not;", '®' => "&reg;", '°' => "&deg;", '²' => "&sup2;", '´' => "&acute;", '¶' => "&para;", '¸' => "&cedil;", 'º' => "&ordm;", '¼' => "&frac14;", '¾' => "&frac34;", 'À' => "&Agrave;", 'Â' => "&Acirc;", 'Ä' => "&Auml;", 'Æ' => "&AElig;", 'È' => "&Egrave;", 'Ê' => "&Ecirc;", 'Ì' => "&Igrave;", 'Î' => "&Icirc;", 'Ð' => "&ETH;", 'Ò' => "&Ograve;", 'Ô' => "&Ocirc;", 'Ö' => "&Ouml;", 'Ø' => "&Oslash;", 'Ú' => "&Uacute;", 'Ü' => "&Uuml;", 'Þ' => "&THORN;", 'à' => "&agrave;", 'â' => "&acirc;", 'ä' => "&auml;", 'æ' => "&aelig;", 'è' => "&egrave;", 'ê' => "&ecirc;", 'ì' => "&igrave;", 'î' => "&icirc;", 'ð' => "&eth;", 'ò' => "&ograve;", 'ô' => "&ocirc;", 'ö' => "&ouml;", 'ø' => "&oslash;", 'ú' => "&uacute;", 'ü' => "&uuml;", 'þ' => "&thorn;", '¡' => "&iexcl;", '£' => "&pound;", '¥' => "&yen;", '§' => "&sect;", '©' => "&copy;", '«' => "&laquo;", '¯' => "&macr;", '±' => "&plusmn;", '³' => "&sup3;", 'µ' => "&micro;", '·' => "&middot;", '¹' => "&sup1;", '»' => "&raquo;", '½' => "&frac12;", '¿' => "&iquest;", 'Á' => "&Aacute;", 'Ã' => "&Atilde;", 'Å' => "&Aring;", 'Ç' => "&Ccedil;", 'É' => "&Eacute;", 'Ë' => "&Euml;", 'Í' => "&Iacute;", 'Ï' => "&Iuml;", 'Ñ' => "&Ntilde;", 'Ó' => "&Oacute;", 'Õ' => "&Otilde;", '×' => "&times;", 'Ù' => "&Ugrave;", 'Û' => "&Ucirc;", 'Ý' => "&Yacute;", 'ß' => "&szlig;", 'á' => "&aacute;", 'ã' => "&atilde;", 'å' => "&aring;", 'ç' => "&ccedil;", 'é' => "&eacute;", 'ë' => "&euml;", 'í' => "&iacute;", 'ï' => "&iuml;", 'ñ' => "&ntilde;", 'ó' => "&oacute;", 'õ' => "&otilde;", '÷' => "&divide;", 'ù' => "&ugrave;", 'û' => "&ucirc;", 'ý' => "&yacute;", 'ÿ' => "&yuml;");
    while( ( my $key, my $obj ) = each( %entityRef ) ) {
        if( $key ne '&' ) {
                $str =~ s/$key/$obj/gis
        } else {
                $str =~ s#&((?!(quot;)|(amp;)|(cent;)|(curren;)|(brvbar;)|(uml;)|(ordf;)|(not;)|(reg;)|(deg;)|(sup2;)|(acute;)|(para;)|(cedil;)|(ordm;)|(frac14;)|(frac34;)|(Agrave;)|(Acirc;)|(Auml;)|(AElig;)|(Egrave;)|(Ecirc;)|(Igrave;)|(Icirc;)|(ETH;)|(Ograve;)|(Ocirc;)|(Ouml;)|(Oslash;)|(Uacute;)|(Uuml;)|(THORN;)|(agrave;)|(acirc;)|(auml;)|(aelig;)|(egrave;)|(ecirc;)|(igrave;)|(icirc;)|(eth;)|(ograve;)|(ocirc;)|(ouml;)|(oslash;)|(uacute;)|(uuml;)|(thorn;)|(iexcl;)|(pound;)|(yen;)|(sect;)|(copy;)|(laquo;)|(macr;)|(plusmn;)|(sup3;)|(micro;)|(middot;)|(sup1;)|(raquo;)|(frac12;)|(iquest;)|(Aacute;)|(Atilde;)|(Aring;)|(Ccedil;)|(Eacute;)|(Euml;)|(Iacute;)|(Iuml;)|(Ntilde;)|(Oacute;)|(Otilde;)|(times;)|(Ugrave;)|(Ucirc;)|(Yacute;)|(szlig;)|(aacute;)|(atilde;)|(aring;)|(ccedil;)|(eacute;)|(euml;)|(iacute;)|(iuml;)|(ntilde;)|(oacute;)|(otilde;)|(divide;)|(ugrave;)|(ucirc;)|(yacute;)|(yuml;)|(nbsp;)))#$obj#gis;   
        }
    }
    return $str;
}
도움이 되었습니까?

해결책

귀하의 질문에 대한 의견에 언급 된 바와 같이, 나는 당신이 정확히 무엇을 요구하는지 잘 모르겠습니다.

따라서 유니 코드 문자를 HTML 엔티티로 변환하려고한다고 가정합니다. 이 경우 미리 만들어진 모듈 중 하나를 사용하는 것이 더 좋습니다. 인코딩 문제 (Perl에서 매우 까다로운)로 인해 작동하지 않는 경우 질문에 대한 답변이 있습니다.

인코딩 옵션이 없습니까?

open FILE, "<", $file or die "Cannot open:$!\n", "UTF-8";

... 아마 그것을 해결할 것이고, 아마도 자신의 시도를 할 것입니다. 그러나 기성품을 사용하는 것이 더 좋습니다 ;-) (그런데, 당신이 쓴 방식은 "UTF-8로 썼습니다. "옵션 die 당신이 무엇을 요구했는지 이해하기가 조금 어려워졌습니다 ;-)

예, 최근에 있다고 가정하면 UTF-8 옵션이 있습니다. perl (> = v5.8) :

open(my $fh,'<:encoding(UTF-8)', $file) or die "Error opening $file: $!";

(예제에서 수정 된 예 Perluniintro)

당신은 또한 사용할 수 있습니다 binmode 이미 열린 파일 핸들 (예 : stdin/out)을 변경합니다.

binmode(STDOUT, ":encoding(UTF-8)");

또한 기본 인코딩을 설정할 수도 있습니다 열려 있는 프라그마.

그러나 이것을 위해 나는 시도하는 것이 좋습니다 binmode 또는 열린 라인을 변경하여 해결 방법을 확인하십시오.

당신이있는 경우 perl v5.8 미만, 상황은 까다 롭지 만 버전을 알려 주면 해결할 수 있습니다.

그건 그렇고 내가 알아 차린 몇 가지 다른 것들 :

  • 필수는 아니지만 어휘 스코프 파일 핸들을 사용하는 것이 더 나은 것으로 간주됩니다 (my $fh 대신에 FILE).
  • 당신이 새로운 라인을 넣을 때 die 문자열, 문제를 찾는 데 도움이되는 줄 번호 정보를 억제합니다.
  • 열 수없는 파일의 이름 (또는 실패한 SQL 또는 다이 메시지)을 넣으면 디버그하기가 더 쉬울 것입니다.
  • Perl (5)에서 하위 프로토 타입을 사용하지 마십시오. : (sub unicodeConvert($)). 넣지 마십시오 $/@/% 거기에. 그것은 단지 사물을 점검 할뿐만 아니라 혼란스러운 방식으로 의미를 바꿀 수 있습니다. 새로운 "내장 스타일"연산자 만 만들기 만하면됩니다.

다른 팁

터미널의 숯 (UTF-8 일 수 있음)과 PERL 스크립트의 소스 코드 (8859-1의 일부 Charset-Aware 편집기에서 편집 할 수 있음)의 차이가 있다고 생각합니다. 확실하다면, 터미널과 소스 코드가 같은 숯으로 이루어지면 use utf8; 스크립트 헤더에 (참조 남자 펄 루니 코드). 도움이되지 않으면 데이터베이스에 저장된 데이터를 인쇄하십시오 (DBI의 디버그 로깅 증가) (데이터를 UTF8로 저장하지 않으므로 관련이 없음). 일반적으로 제공하십시오.

  1. 터미널의 코딩 (Codepage) (locale) 터미널 용 스크립트를 실행하는 경우 (또는 서버에서 사용하는 시스템 로케일, EG Apache에서 시작한 경우)
  2. 소스 코드의 숯.
  3. MySQL 연결 CodePage (문제가 있습니까? SET NAMES 'utf8'?)

또한 HTML 인코딩의 경우 재사용이 쉬울 수 있습니다. HTML::Entities::decode() / HTML::Entities::encode() 이것을 스스로 구현하기보다는.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top