2009-08-23 3 views
2

저는 데이터베이스에 저장할 utf-8 코어로 변환 된 문자 묶음을 얻는 데 어려움을 겪고 있습니다.특수 문자 (html_entity_decode, iconv 등)로 어려움을 겪고 있습니다.

PHP iconv가 여러 문자에서 실패하므로 내 자신의 '솔루션'을 만들어야합니다. 실제로 작동하지 않으면 솔루션이 아니며 Windows에서 거의 완전히 실패하므로 iconv는 테스트 서버에서 'dev'를 사용해야하므로 대부분 효과가 없습니다. 또한, iconv 많은 문자를 그리워, 그것은 전혀 도움이되지 않습니다. 여기

내가 그것은 가끔 기능을 대체 할 여러에서 동일한 문자를 가지고 비효율적 보일 수

 
function replace_accents($string) { 
    return str_replace(array('à','á','â','ã','ä', 'ç', 'è','é','ê','ë', 'ì','í','î','ï', 'ñ', 'ò','ó','ô','õ','ö', 'ù','ú','û','ü', 'ý','ÿ', 'À','Á','Â','Ã','Ä', 'Ç', 'È','É','Ê','Ë', 'Ì','Í','Î','Ï', 'Ñ', 'Ò','Ó','Ô','Õ','Ö', 'Ù','Ú','Û','Ü', 'Ý'), array('a','a','a','a','a', 'c', 'e','e','e','e', 'i','i','i','i', 'n', 'o','o','o','o','o', 'u','u','u','u', 'y','y', 'A','A','A','A','A', 'C', 'E','E','E','E', 'I','I','I','I', 'N', 'O','O','O','O','O', 'U','U','U','U', 'Y'), $string); 
} 


function replaceQuote($string){ 
$replaceQuote=array('‘', '’', '“', '”', ''','‚','„',''',"’"); 
    return str_replace($replaceQuote,'\'', $string); 
} 

function replaceArray($string){ 
$replaceArray=array('—', '™','™','™','©', '®', '®','©', 
        '¡', 
        '¡', 
        '¢', 
        '¢', 
        '£', 
        '£', 
        '¤', 
        '¥', 
        '¥', 
       '¦', 
      '§', 
       '§', 
      '«', 
      '«', 
      '¬', 
      '¬', 
      '­', 
      '¯', 
      '¯', 
     '²', 
      '³', 
      'µ', 
      'µ', 
      '¶', 
      '¶', 
      '·', 
      '·', 
      '¸', 
      '¸', 
      '¹', 
     'º', 
     'º','»', '‹', '»','¼', '½','¾','♥', '☆', '☠', '░','▒','▓','█', '★', 
'♪','♫','◄','▀','▄','►', '¤', '^', '☣', '…', '†', '‡', '.:','♣','Ξ','ξ','↠','⇒','→','↞','⇐','←', 
'⇔','↔','™','♠','&loz','√','∩','&Cap','∴'); 
    return str_replace($replaceArray, '', $string); 
    } 

function special_replace($string){ 
    $replace_from=array('ƒ', 'Œ','œ','•', '–', '—','˜','š','Š','Ÿ','ÿ','ε', 
    '€','α','Α','τ','Τ','θ','Θ'); 

    $replace_to=array('ƒ', 'Œ','œ','•','-','-','~','š','Š','Ÿ','ÿ','ε','€','α','Α','τ','Τ','θ','Θ'); 
return str_replace($replace_from, $replace_to, $string); 


} 

function dbSlug($slugIt){ 
$slugIt=html_entity_decode($slugIt); 

$slugIt=replaceArray($slugIt); 
$slugIt=replaceQuote($slugIt); 
$slugIt=special_replace($slugIt); 

//$slugIt=iconv('ISO-8859-1', 'UTF-8//TRANSLIT//IGNORE', $slugIt); 
$slugIt=replace_accents($slugIt); 
$slugIt=trim($slugIt); 
     return $slugIt; 

    } 

을하고 내 기능을 가지고 무엇을하지만 난 다른 방법으로 여러 위치에 기능을 사용하므로,이 왜 나는 하나 이상의 교체 기능에서 동일한 특성을 가질 수 있습니다.

이제는 데이터를 볼 때마다 문자를 찾고 바꾸거나 제거하는 미로를 통해 잡히지 않는 또 다른 특수 문자가 있음을 발견했습니다.

현재 불쾌감을주는 캐릭터는 '무해한 것'이라고 생각합니다. 데이터베이스에서 'Â'로 끝나는 항목이 있습니다. 모든 공간이 당신을 염두에 두지는 않는다. 그것은 단지 일부 공간에만 영향을 미친다 (나는 아직 이유를 알지 못했다).

나는 1 주일 이상이 시간을 보냈고, 돌아가서 볼 때마다 '수정'에 더 많은 것을 추가했습니다.

나는 'Â'를 제거하는 방법을 묻지 않고 있는데, 콘텐츠/데이터의 무결성을 유지하는 방법에 대한 해결책을 얻으려고하지만 데이터를 이동할 때 때로는 엉망이되는 특수 문자는 필요하지 않기를 바라고 있습니다. 검색 가능성을 유지합니다.

나는

 
preg_replace("/[^a-zA-Z0-9,-\'-!&.etc]/", "", $data); 
을 할 것이지만, 놓친 특수 문자가 바뀌면 단어가 엉망이되기 시작할 것이라고 염려합니다. 나는 'Mxico'가 'Mxico'에서 나왔던이 경험을 이미 가지고 있기 때문에 그냥 작동하지 않습니다.

문자 인코딩은 인코딩 전에 ISO-8859-1로 헤더를 변경하거나 인코딩을 설정하지 않았지만 항상 같은 결과를 얻었지만 문자 인코딩은 UTF-8로되어 있습니다.

나는 아마도 이것이 가능한 가장 최악의 방법 일 것이라고 확신하지만 효과적인 해결책을 찾을 수 없었습니다. 어떤 제안? 내 관심은 이것이 거의 끝나지 않고 항상 번역의 미로를 통해 놓친 새로운 인물을 찾고 있다는 것입니다.

+1

mysql에 utf8로 인코딩 된 문자를 저장하는 방법에 대한 실제적인 문제는 해결하려고합니까? 이 모든 음역 코드는 mysql 연결 문자셋에 문제가 있음을 나타내므로 실제로 utf8 문자를 보낼 수 없습니다. – VolkerK

+0

모든 코드가 utf8로 인코딩 된 문자를 저장하는 것이 아니라 일부는 실제로 '★'와 같이 쓸모없는 문자를 제거하는 것입니다. 문제는 두 가지로 보일 수 있습니다. eyze의 대답은 내가 이미 벗겨 낸 물건/교체 된 물건을 정리하는 것 같았다. 불행히도 내 서버가 파일에서 인코딩을 허용하지 않는 것 같습니다. 그래서 제거 된 (또는 시도한) 문자는 여전히 제거되지 않습니다. – pedalpete

답변

2
  1. PHP 파일을 UTF-8로 저장하십시오.
  2. 연결시 SET NAMES 'UTF8'; 당신은 여전히 ​​문자를 교체해야하는 경우

다음을 수행하십시오

$string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')); 

편집 :

$string = html_entity_decode(preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')), ENT_COMPAT, 'UTF-8'); 
+1

와우! 그건 멋지고 간결합니다. 그리고 그것은 너무 잘 작동합니다 (제한된 테스트에서). 하나의 질문이지만, preg_replace의 htmlentites. 비 -html 인코딩 문자를 얻으려고합니다. 일부 공간이 & nbsp와 같이 나오는 것을 보았습니다. & quot 및 & rsquo 등의 인용문이 여전히 있습니다. 이는 지금까지 수행 한 매우 제한된 테스트에 불과합니다. 원래 완료되었습니다. preg_replace를 복사 한 것과 똑같이 복사했습니다. – pedalpete

+0

방금 ​​내 대답을 편집했습니다. 지금 시도하십시오. –

+0

편집에 대한 초기 테스트에서 따옴표와 관련된 문제점을 발견했습니다. htmlentities ($ string, ENT_NOQUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8'로 변경했습니다. 그건 괜찮아 보이지만, 나는 '' '' '을 얻고 있습니다. 나는 적어도 RSQUO로 나오기를 기대했지만, 불행히도 그렇지는 않았다. 그 문제를 해결하는 방법에 대한 아이디어가 있습니까? – pedalpete

1

사용할 수있는,의 html_entity_decode ($의 strint, ENT_QUOTES, 'UTF-8 ')

스페인어 특수 문자에 문제가있었습니다. 이것으로 해결했습니다

+0

나를 구 해주세요! 감사 –