2014-11-12 4 views
0

우리 회사는 웹 서비스 zu를 사용하여 매우 오래된 프로젝트의 데이터를 꽤 새로운 프로젝트로 보냅니다. 이전 프로젝트는 기본적으로 json_encode 메소드가없는 PHP4.4를 실행합니다. 그래서 우리는 대신 PEAR 클래스 Service_JSON을 사용했습니다. http://www.abeautifulsite.net/using-json-encode-and-json-decode-in-php4/PHP4 : 멀티 바이트 문자를 허용하는 Json_encode 메서드

오늘은, 발견이이 클래스 수 멀티 바이트 문자하지 거래 문자열에서 charcodes을 얻고 문자를 대체하기 위해이 광범위하게 ord()을 사용하기 때문에. 새로운 PHP 버전에서는 mb_ord() 구현이 없습니다. 또한 $ string {$ index}를 사용하여 인덱스에서 char을 액세스 할 수 있습니다. 다중 바이트 문자를 지원하는지 확실하지 않습니다.

//Excerpt from encode() method 

// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT 
      $ascii = ''; 
      $strlen_var = $this->strlen8($var); 

      /* 
      * Iterate over every character in the string, 
      * escaping with a slash or encoding to UTF-8 where necessary 
      */ 
      for ($c = 0; $c < $strlen_var; ++$c) { 

       $ord_var_c = ord($var{$c}); 
       //Here comes a switch which replaces chars according o their hex code and writes them to $ascii 

우리는

$Service_Json = new Service_JSON(); 
$data = $Service_Json->encode('Marktplatz, Hauptstraße, Endingen'); 
echo $data; //prints "Marktplatz, Hauptstra\u00dfe, Endinge". The n is missing 

우리는 직렬화 배열을 수신하고 json_encoded 문자열을 반환 다른 웹 서비스를 설정하여이 문제를 해결 호출합니다. 이 서비스는 현대적인 마힌 (mahine)에서 실행되므로 PHP5.4를 사용합니다. 그러나이 "솔루션은 매우 어색하고 더 좋은 일을 찾아야한다. 누군가가 생각이 있습니까?

문제 설명

독일어 움라우트가 제대로 대체됩니다.하지만 다음 문자열 끝에서의 절단 ORD 잘못된 문자를 반환하기 때문에.. mb_strlen을() 아무것도 변경되지 않습니다,이 경우 나 strlen 같은 길이를 제공합니다.

입력 문자열이 "Hauptstraße, EndingenMarktplatz", 끝의 n은이었다 잘라 내기. ß 올바르게 \ U00df로 인코딩되었습니다. 모든 Umlaut에 대해 그것은 끝 부분에 하나 이상의 문자를 자릅니다.

이유는 우리의 이전 데이터베이스 인코딩이지만 교체 자체가 올바르게 작동하므로 ord() 메소드와 같을 수 있습니다.

+0

'Services_JSON' 모듈을 다운로드하고 입력 데이터로 테스트했습니다. 완벽하게 잘 했어. 나는'\ u00df'와 같은 인코딩을 가지고 있지만 마지막'n'을 놓치지 않았습니다. 'strlen ($ your_input_string)'을하면 어떻게 될까요? –

+0

길이가 33을 반환합니다. 올바른 경우 데이터베이스 인코딩이 잘못되었습니다. mb_check_encoding()은 mb_detect_encoding()이 utf-8을 반환하는 동안 false를 반환합니다. – Corni

+0

길이가 33 인 경우 'ß'는 '0xC39F'의 UTF-8 표현이 아닌 '0xDF'의 1 바이트 문자로 입력됨을 의미합니다. 그게 문제가 될 수 있을지 모르겠습니다. –

답변

1

동료는

mb_strlen($var, 'ASCII'); 

이 문제를 해결할 수 있다는 것을 발견했다. 우리는 간단한 mb_strlen을 사용하는 오래된 lib 버전을 사용했습니다. 이 수정은 mb_convert_encoding()과 동일하게 수행됩니다.

문제가 해결되었습니다. 당신의 도움을 주셔서 대단히 감사합니다!

관련 문제