도저히 안되어 질문을 드립니다.
물론 불가능으로 나름대로 결론을 내리고 있습니다.
하지만
마지막으로 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
function unichar($match) {
return mb_convert_encoding($match[0], "utf-8", "HTML-ENTITIES");
}
이것은 사용한 콜백함수 입니다.
즉 김광석웹1.jpg 으로 디코더 되었다면
php에서 아래 구문을 실행하면
출력이 "김" 대신에 "**광석웹1.jpg"으로 출력이 되어야 하지요.
예) $value = str_replace("김", "**", $value); echo $value;
이게 정말 안되더군요.
화면 출력은 제대로 나오지만 db에는 김광석웹1.jpg 으로 저장이 되지 않습니다.
그러면 콜백함수에 그걸 반영하면
되나요
가능할것 같습니다
하지만 아래의 고수들이 등장하니 뭔가 기대가 됩니다.
사이트에서 해보면 화면 출력은 정말 디코드 잘됩니다.
요즘은 머리가 알콜성 치매라 문서를 읽어도 검은색은 종이요....흰색은....어라 이게 아닌데..
어째든 고생이 많으시네요.현업에서 나온지 오래된 구닥다리 프로그래머라 도움도 못드리는데...
보통은 자료 분석시 우선 글자에 해당하는 코드값이 어느곳에 포함되어지나 확인해 보시는것도..
저장하시는 방식이 디비라면 설치와 설계시 언어코드를 어떤것을 적용했나도 확인을 해보셔야 할듯 싶습니다
그리고 웹페이지쪽은 자동 인코딩해 보여주는 경우도 있어서..
오래전에 파일명에서 특정 자리수 글자를 추출해서 가공해 특정자리수로 맞추어야 했는데.. 유니코드라는 이상한 놈 때문에 고생했던 기억이..
실력자들이 붙어야 될 것 같아요.
아래 댓글처럼 해보고 나면
설날 특집 무분이던지 뭔가 보상을 톡톡히 해야겠습니다.
주로 사용하는게 자바스크립트여서 자바스크립트 소스로 간단하게 적어보겠습니다..
자바스크립트에서는 노멀라이즈 한번 거쳐주시면 간단합니다.
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"
일단 해보고 난후에 다시 댓글을 달겠습니다.
html_entity_decode($value,ENT_XML1, 'UTF-8'))
이렇게 하시면 정상적으로 변환이 됩니다.. 그다음 사용하시면 될듯 합니다.
$value 자체가 .. 자소분리된 자체로 저장되어 .. UTF-8로 변환된 것도
자소 변환 상태로 나옵니다. 자소 변환 상태의 utf-8 로 검색하면 변환이 되지만
온전한 김 UTF-8 로 찾으면 못찾아 버립니다.
$value 를 만들 당시 조합된 상태로 저장을 해야 할듯 합니다...
$value 위쪽이 문제인듯..
제대로 김광석웹1.jpg로 인코딩이 됐다면 $value값이
김광섭웹1.jpg
이렇게 나와야 할것 같습니다.
일단 해보고 난후에 다시 댓글을 달겠습니다.
해결 하셨다면 자소 분리된 상태로 넘어온것을 조합하거나 .. 아니면 자바스크립트에서 .. 분해된걸 조합된상태로
넘겨주거나 둘중에 하나가 성공 해야 하는데 ..
$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 위쪽에 .. 몇줄 추가 하시면 끝날듯
일단 해보고 난후에 다시 댓글을 달겠습니다.
$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)
일단 해보고 난후에 다시 댓글을 달겠습니다.