C# UTF-8 문자열의 한글 자모 분리 문제
문제 발생
네덜란드의 모 기관과 협업하던 도중에 발생한 문제이다.
분명 서버가 UTF-8 인코딩을 지원하는데 post로 보낸 한글이 response에서 자음 모음이 분해되는 현상이 발생하였다.
예컨대 “한글” 이라는 단어가 “ㅎㅏㄴㄱㅡㄹ” 하는 식으로.
어라? 이거 맥에서 만든 파일 윈도우에서 볼 때 발생하는 그 현상이잖아?
이제 내가 짠 WPF 안에서 뭐가 잘못됐는지 찾아야 했다.
삽질 시작…
보낼 때 실수했나?
처음엔 와이어샤크로 패킷을 뜯으려고 했다. 그런데 내용이 안 보였다.
아 맞다 이거 https지…
실패
간단하게 로컬 PHP Echo 서버를 만들어서 받은 내용을 그대로 echo 찍도록 만들었다.
음? response가 잘 보인다. 한글이 제대로 리턴된다. 그럼 내 C# 코드에는 문제가 없었나?
서버가 의심스러워지는 순간이었다.
혹시 몰라서 POSTMAN으로 똑같은 내용을 각각 로컬 echo 서버와 해외서버로 보내봤다.
잘 돌아온다. 어? 그럼 서버 문제가 아닌가?
상반된 결과에 문제 발생 지점을 좁히기가 힘들었다.
받은 데이터를 읽을 때 실수했나?
다른 툴로 쏜 데이터가 제대로 돌아왔기 때문에 내 C# 코드가 불안해지는 순간이었지만 그래도 이상한 점은 있었다.
C#코드에 문제가 있다면 로컬 echo 서버에서 돌아온 한글은 왜 문제가 없었을까?
일단 네덜란드에 문의를 넣고 UTF-8 문서를 뒤져보았다. 사실 서버로 전송만 똑바로 되면 리턴된 한글은 어떻게든 합쳐서 읽으면 그만이었기에 네덜란드에서 어떤 답신이 오는지 기다리고 있었다.
그리고 네덜란드 담당자와 거의 비슷한 시점에 문제를 파악했다.(사내에서 비슷한 이슈로 고통받은 사람들의 도움을 받았다)
결론 : UTF-8이라고 방심하지 말자
회신에 따르면 네덜란드에 있는 서버는 NFD 정규화를 사용한다. NFD정규화에서 한글은 ‘첫가끝코드’로 처리되는데, 이때 한글 자모가 분해된다.
그런데 이 자모 분리에 따른 16진수값은 음절 분리 형식을 따르는 한글 표기법과 함께 UTF-8에 포함되어 있다. 같은 UTF-8이라고 방심하면 같은 글자를 다른 방식으로 정규화게 되므로 표현이 달라지는 것이다.
따라서 내가 할 일은 C#의 String 함수 중 Normalize를 이용하여 리턴된 한글을 C#에 맞게 다시 읽어주기만 하면 되는 것이다.
예상대로 서버쪽 DB에는 우리가 전송한 데이터가 정상적으로 입력되었다고 한다.