XmlConvert.IsXmlChar 사용시 Emoji escape 문제

안녕하세요 다름이 아니라 제목처럼 Emoji(이모지) 관련해서 문제가 있어 질문 글을 등록하게 되었습니다.

어떠한 문자열을 변수에 담고 나서, 인코딩합니다.
인코딩 한 후에 디코딩 한 후에 해당 문자열 중에서 xml에 적합치 않은 문자열이 있는지 검증하기 위해
XmlConvert.IsXmlChar을 사용 중에 있습니다.

위 사진은 디코딩을 한 후의 문자열이라고 인식하시면 될 것 같습니다.
소스를 보게 되면 convert를 한 후에는 이모지가 전부 사라지고 있는데,
escape 되지 않도록 다른 방법이 있나 찾아보고 있지만 도저히 생각히 나지 않아 글을 쓰게 되었습니다.

현업에서 이모지 사용을 하고 싶다고 하도 요청이 와서… 결국 도움을 청하고자 문의드립니다.

좋아요 2

혹시 이 방법은 어떨까요?
XML을 다룰 때 문자 체크를 하지 않는 것인데 한번 고려해볼만 한 것 같아요.

좋아요 2

안녕하세요~! 답변 보내주신지 거진 일주일이 지나 답변을 드리네요.
이게 해당하신 방식은 안타깝게 동작하지 않아서 실패했지만…

새로운 방법(?)을 찾았고, 검증 중에 있습니다.

xmlConvert의 내장함수를 보게 되면 VerifyXmlChars가 있습니다.

public static void Main()
	{
		string Test1, Test2, Result1, Result2; 
		
		Test1 = "이모지😢😢❤😂이모지";				
		
		bool check = IsValidXmlString(Test1);
		
		if(check == true) {
			Console.WriteLine("Test1 = "+Test1);
                   Console.WriteLine(CheckInvalidXmlChars(Test1));
		}
		else {
			var Convert1 = Test1.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
			Console.WriteLine("Convert1 = " + Convert1);
		}			
		
	}
	
	static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
static string CheckInvalidXmlChars(string pStrText)
	{
		return XmlConvert.VerifyXmlChars(pStrText);		
		
	}

위 코드와 같이 XmlConvert.VerifyXmlChars를 통해 검증을 하고,
false가 떨어지면 다시한번 XmlConvert.IsXmlChar를 하도록 생각 했습니다.

다만 위에 말씀드렸다시피 검증중에 있는데…
IsXmlChar 의 설명은 전달된 문자가 올바른 XML 문자인지 확인합니다.
VerifyXmlChars의 설명은 문자열 인수의 모든 문자와 서로게이트 쌍 문자가 올바른 XML 문자인 경우 전달된 문자열을 반환하고 그렇지 않으면 첫 번째 잘못된 문자에 대한 정보로 XmlException을 throw합니다.

동일하게 xml문자인지 검증하는데, isxmlchar의 경우는 이모지를 escape하고, verifyXmlchars의 경우는 true(또는 이모지 그대로) 뱉어내는게 현재 의심중입니다…
(이모지는 대표적인 써로게이트 쌍 문자로써 isXmlChar가 단순히 인식을 못하는건지…)

p.s isxmlchar(이모지:cry::cry::heart::joy:이모지) 의 결과값은 이모지:heart:이모지
p.s VerifyXmlChars(이모지:cry::cry::heart::joy:이모지)의 결과값은 string으로 받았을 경우 이모지:cry::cry::heart::joy:이모지 입니다.(bool은 true)

좋아요 3

위와 같이 수정해서 해결 되었습니다~!

좋아요 4