2017-11-02 1 views
2

나는 그것에서 유니 코드를 포함

"JPMorgan Chase \x{0026} Co" 

로 변환하고 싶습니다. (큰 따옴표와 작은 따옴표의 차이점에 유의하십시오.)

가장 쉬운 방법은 무엇입니까? 이것은 단순화 된 예입니다. 실제 문제에는 그러한 많은 경우가 있습니다.

+2

'$ x = eval qq { "$ x"}'? – mob

+0

이것은 실제로 작동합니다. 고마워! –

+0

참고 [\ x 대체 안 함] (https://stackoverflow.com/q/39992351/2173773) –

답변

4

당신이 처리 할 필요가있는 유일한 탈출 형식은 \x{1234} 다음, 정규 표현식으로 이스케이프 시퀀스와 일치하는 문자를 16 진수 문자열로 변환 chr(hex($1))을 사용할 수 있습니다이 문제를 처리 한 후 하나의 방법 인 경우 :

my $x = 'JPMorgan Chase \x{0026} Co'; 
$x =~ s/\\x\{([0-9a-f]+)\}/chr(hex($1))/e; 
say $x; # -> "JPMorgan Chase & Co" 
+0

이 방법도 사용할 수 있습니다. 전에는/e 플래그를 알지 못했습니다. 감사. –

+0

아마도 \\ 또한 처리 할 필요가있을 것입니다. – ikegami

+0

@ikegami 나는 입력이 실제로 무엇인지에 달려있다. 질문에서'\ x {1234} '문법 만 언급 했으므로 ... – duskwuff

2

duskwuff & mob가 직접 질문에 답변하는 훌륭한 일을하는 동안. (FWIW : mob의 $x = eval qq{"$x"}은 부인할 수없는 우아함을 가지고 있습니다.) 실제 질문은 보간 문자열 이외의 다른 곳에서 Perl 문자를 이스케이프 처리하는 이유입니다.

  • URI 인코딩 : %26 당신이 당신의 소스 코드 (IO)보다 어딘가 다른에서이 문자열을 받고 있으며, 원시 유니 코드 인코딩을 inappropreate 경우, 펄 쉽게 사용할 모듈을 갖고있는보다 일반적인 인코딩을 고려
  • XML 인코딩 : &#x26
  • JSON 인코딩 : \u0026

... 그리고 많은 다른 사람. 이러한 인코딩은 IPC 및 데이터 파일을 다른 시스템과 훨씬 더 상호 운용 할 수있게합니다.

... 물론이 경우 은 Perl 소스에서입니다. 이중 따옴표로 묶어 컴파일러 단계에서 보간하도록하십시오.

관련 문제