[완료]html 앤티티 Decode 관련 질문입니다. 이게 가능한 방법이 있는지요?

   조회 3840   추천 0    

도저히 안되어 질문을 드립니다.

물론 불가능으로 나름대로 결론을 내리고 있습니다.

하지만 

마지막으로  2cpu 고견을 들어보고 

그렇게 결론지어도 좋겠다는 생각에 글을 적습니다.


먼저 이것은 맥의 크롬 브라우저에서 

한글 파일명을 HTML 앤티티화 시켜버려서 자소 조합으로 보여준 코드입니다.

$value="김광석웹1.jpg"

이것을 화면에 출력하면

김광석웹1.jpg  으로 출력이 됩니다.

그러나 실제 한글의 문자로 변환하고자 하는데

가능한가요?


아무리 해봐도 화면출력은 "김광석웹1.jpg"은 나오지만

하지만 실제는 한글 html 엔티티가 화면에 저렇게 표현된것 뿐입니다.


html_entity_decode($value, ENT_NOQUOTES, 'UTF-8');

이렇게도 해봤습니다. ㅠㅠㅠ

만일 

실제적으로 디코드 되었다면

화면출력만이 아닌 실제 해당 문자로 변환이 되어 

글자 치환이나 글자 검색이 되어야 하는데...

예) $value = str_replace("김", "**", $value); echo $value;

화면만 뿌려주고 실제는 전혀 되지 않습니다.ㅠㅠㅠ


참고로 아래의 html  앤티티는 "파이어폭스"라는 글자인데 

html_entity_decode($value, ENT_NOQUOTES, 'UTF-8');  으로 하면 실제 문자로 변환이 됩니다.

$value = '파이어폭스';


아마도 힘든 질문이 될련지...

방식은 자바스크립트와 php 등 상관이 없습니다.

예전에 나를 도와준 마틴님이란 분이 있어 그분을 기억합니다.
2cpu의 도움주신 많은 분들께 늘 감사드립니다.
☎ HP 010-9678-7900
짧은글 일수록 신중하게.
허인구마틴 2019-02
$_value = preg_replace_callback('/&#[0-9]+;/', 'unichar', $_value);
function unichar($match) {
    return mb_convert_encoding($match[0], "utf-8", "HTML-ENTITIES");
}
이것은 사용한 콜백함수 입니다.
     
허인구마틴 2019-02
실제 문자라는 말은 화면출력이 아닌 실제로 사용이 가능한 문자를 말하는 것입니다.
즉 김광석웹1.jpg 으로 디코더 되었다면
php에서  아래 구문을 실행하면
출력이 "김" 대신에 "**광석웹1.jpg"으로 출력이 되어야 하지요.

예) $value = str_replace("김", "**", $value); echo $value;

이게 정말 안되더군요.
화면 출력은 제대로 나오지만  db에는 김광석웹1.jpg 으로 저장이 되지 않습니다.
               
허인구마틴 2019-02
아~  네
그러면 콜백함수에 그걸 반영하면
되나요
                         
허인구마틴 2019-02
감사합니다
가능할것 같습니다
                         
허인구마틴 2019-02
가능할 것 같다는 착각의 희망고문이었습니다.
하지만 아래의 고수들이 등장하니 뭔가 기대가 됩니다.
허인구마틴 2019-02
https://mothereff.in/html-entities
사이트에서 해보면 화면 출력은 정말 디코드 잘됩니다.
양철괭이 2019-02
아주 아주 오래전 한글 처리 기법이 궁금해 오토마타 알고리즘에 대해 흥미를 가지긴 했었는데..
요즘은 머리가 알콜성 치매라 문서를 읽어도 검은색은 종이요....흰색은....어라 이게 아닌데..
어째든 고생이 많으시네요.현업에서 나온지 오래된 구닥다리 프로그래머라 도움도 못드리는데...
보통은 자료 분석시 우선 글자에 해당하는 코드값이 어느곳에 포함되어지나 확인해 보시는것도..
저장하시는 방식이 디비라면  설치와 설계시 언어코드를 어떤것을 적용했나도 확인을 해보셔야 할듯 싶습니다
그리고 웹페이지쪽은  자동 인코딩해 보여주는 경우도 있어서..
오래전에  파일명에서 특정 자리수 글자를 추출해서 가공해 특정자리수로 맞추어야 했는데.. 유니코드라는 이상한 놈 때문에 고생했던 기억이..
     
허인구마틴 2019-02
아~ 이건 똥고집을 부려서 될 문제가 아니었습니다.
실력자들이 붙어야 될 것 같아요.
아래 댓글처럼 해보고 나면
설날 특집 무분이던지 뭔가 보상을 톡톡히 해야겠습니다.
욱가 2019-02
자소분리때문에 디코드후에 replace를 할수없을겁니다..
주로 사용하는게 자바스크립트여서 자바스크립트 소스로 간단하게 적어보겠습니다..
자바스크립트에서는 노멀라이즈 한번 거쳐주시면 간단합니다.

function decode(str) {
    return str.replace(/&#(\d+);/g, function(match, dec) {
        return String.fromCharCode(dec);
    });
}

var decodedData = decode("HTML_ENTITY_HERE");
var normailizedData = decodedData.normalize("NFC");

console.log("기존 자모 분리된 상태의 길이 : "+decodedData.length);
console.log("노멀라이즈된 : "+normailizedData.length);

normailizedData = normailizedData.replace("김", "욱가");
console.log(normailizedData);


===== output =====
"기존 자음 모음 분리된 상태의 길이 : 17"
"노멀라이즈된 : 9"
"욱가광석웹1.jpg"
     
허인구마틴 2019-02
감사합니다.
일단 해보고 난후에 다시 댓글을 달겠습니다.
김제연 2019-02
뭔가 해서 찾아보니 xml 인코딩이라고 합니다.. 첨들어보는거긴 한데 ..

html_entity_decode($value,ENT_XML1, 'UTF-8'))

이렇게 하시면 정상적으로 변환이 됩니다.. 그다음 사용하시면 될듯 합니다.
     
욱가 2019-02
디코딩후 str_replace 먹나요?
          
김제연 2019-02
잘 되야 하지만.. 위의 상황에서는 작동이 안됩니다..
$value 자체가 .. 자소분리된 자체로 저장되어 .. UTF-8로 변환된 것도
자소 변환 상태로 나옵니다. 자소 변환 상태의 utf-8 로 검색하면 변환이 되지만
온전한 김 UTF-8 로 찾으면 못찾아 버립니다.
$value 를 만들 당시 조합된 상태로 저장을 해야 할듯 합니다...
$value 위쪽이 문제인듯..
제대로 김광석웹1.jpg로 인코딩이 됐다면 $value값이
김광섭웹1.jpg

이렇게 나와야 할것 같습니다.
               
허인구마틴 2019-02
감사합니다.
일단 해보고 난후에 다시 댓글을 달겠습니다.
김제연 2019-02
제가 생각하기론 자유게시판에 맥 한글 파일 업로드 해결 이라고 하셨는데 .. 아직 해결 전이신것 같습니다
해결 하셨다면 자소 분리된 상태로 넘어온것을 조합하거나 .. 아니면 자바스크립트에서 .. 분해된걸 조합된상태로
넘겨주거나 둘중에 하나가 성공 해야 하는데 ..
$value 값자체가 .. 자소분리 상태인값으로 저장되어있는것 보니 .. 둘다 제대로 처리가 안되어있는듯 싶습니다.
처음 자게에 쓰신것처럼.. 자바에서 처리해서 가져오거나.. php 에서 .. 누가 처리 해서 .. 조합을 완성하면
그 아래껀 말씀데로 html_entity_decode($value,ENT_XML1, 'UTF-8'))  로 처리해서 사용하시면 될것 같습니다.
$value 를 김광섭웹1.jpg
로 넣고 테스트 해보세요 ..

php 개발환경이 없으니 .. command line 하려니 .. 뭐가 뭔지 .. ㅎㄷㄷ

노멀라이즈는
http://haah.kr/2017/09/22/mac-filename-normalization/

참조하시면 소스 다있습니다.. $value 위쪽에 .. 몇줄 추가 하시면 끝날듯
     
허인구마틴 2019-02
감사합니다.
일단 해보고 난후에 다시 댓글을 달겠습니다.
욱가 2019-02
<?php 
$value=HTML_ENTITY_HERE;
$data = normalizer_normalize(html_entity_decode($value), Normalizer::FORM_C );   
$output = str_replace("김", "욱가", $data); 
echo $output; // 욱가광석웹1.jpg
 
php도 마찬가지로 노멀라이즈 하니까 간단하게 처리되네요
php.ini 에서 extension=php_intl.dll 혹은 so활성화 하신뒤 사용하시면됩니다.

각각 대응하는 옵션입니다.
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EC%A0%95%EA%B7%9C%ED%99%94
Normalization Form D (NFD)
Normalization Form C (NFC)
Normalization Form KD (NFKD)
Normalization Form KC (NFKC)
     
허인구마틴 2019-02
감사합니다.
일단 해보고 난후에 다시 댓글을 달겠습니다.
허인구마틴 2019-02
완벽하게 해결되었습니다. 감사합니다.
욱가 2019-02
완벽하게 해결하셨다니 제가다 기분이좋네요 수고하셨습니다


QnA
제목Page 1551/5699
2015-12   1638905   백메가
2014-05   5102348   정은준1
2023-03   3845   딥마인드
2015-03   3845   장동건2014
2016-01   3845   김건우
2014-07   3846   오모이데
2019-11   3846   Goldentooth
2018-05   3846   PCMaster
2018-01   3846   YODA34
2021-01   3846   윤건
2015-12   3846   니포
2014-10   3846   강성민
2020-07   3846   용형호제
2017-07   3846   김현우1
2020-12   3846   만년초보
2020-10   3846   ZEBE
2020-03   3846   팔코
2016-01   3846   DOOWON
2018-08   3847   이문영
2021-05   3847   보탕
2015-04   3847   이영규
2016-01   3847   이건희