c++ 에서 한 한글 xor 와 c# 에서 한 한글 xor 의 값이 다르게 나옵니다.

yys3110의 이미지

C++
////////////////////////////////////////

string C_change(string o, string key)
{
	const char* q = o.c_str();
	const char* w = key.c_str();
	char* e = new char[o.length()];
	int key_n = 0;
	for (int i = 0; i <strlen(q); i++)
	{
		if (q[i] == w[key_n])
		{
			e[i] = q[i];
		}
		else
		{
			e[i] = q[i] ^ w[key_n++];
			if (key_n >= strlen(w))key_n = 0;
		}
	}
	e[o.length()] = '\0';
	string a = e;
	return a;
}

C#
/////////////////////////////////////////

string key(string value,string codeKey)
    {
        int k = 0;
        int len = codeKey.Length;
        char[] c1 = value.ToCharArray();
        char[] c2 = codeKey.ToCharArray();
        char[] c3 = new char[value.Length];
        for (int i = 0; i < value.Length; i++)
        {
            if (c1[i] == c2[k])
            {
                c3[i] = c1[i];
            }
            else
            {
                c3[i] = (char)((uint)c1[i] ^ (uint)c2[k++]);
                if (k >= len)
                    k = 0;
            }
        }
        //buff = new string(c3);
        return new string(c3);
    }

코드 입니다.

내용 : 안녕하세요
코드키 : 1234567890

c++ : 륓€堵?꼩
c# : 앹녧핫섌욡
이렇게 틀리게 나옵니다.
영어나 숫자는 잘 나오는데 왜 한글만 이렇게 나오나요? ㅠㅠ
C#은 유니티 C# 입니다.

 의 이미지

잘 알아두세요.
문자열을 다루는 프로그램을 짰는데 영어, 숫자 등은 잘 돌아가는데 한글이 이상하게 동작한다면
열 중 아홉은 인코딩 문제입니다.

기초적인 숫자나 영문자에 대응되는 코드는 ascii의 매핑이 거의 만국공통이 되었지만
한글 문자를 비롯한 비영어권 문자들은 그렇지 않거든요.

조금 알아보니 C#은 utf-16을 디폴트로 쓰는 모양이군요.
C++는 그냥 char라고만 하면 사실 정해진 인코딩이 없습니다.
리눅스 gcc에서는 utf-8, MS Windows의 Visual C++에서는 cp949, 뭐 그런 식이던데요.

해결책이 대충 두 가지 있는데...

1. ascii 범위 안에서만 놀게 만들면 됩니다.
영어권 프로그래머들이 때때로 이런 선택을 해서 비영어권 사용자들을 울리곤 하죠. 근데 뭐 솔직히 편하긴 합니다.
저도 혼자 만들어서 혼자 쓸 프로그램은 솔직히 유니코드 지원 귀찮아서 생략하곤 해요.

2. 인코딩을 열심히 공부하신 뒤 어느 한 인코딩으로 통일합니다.
보통 utf-8로 통일하는 게 보편적이기는 합니다만 상황에 따라 다르지요.
제 생각엔 MS Windows 환경에서 C#과 VC++를 연동한다면 utf-16으로 통일하는 것도 나쁘지 않다고 봐요.
VC++에서는 wchar_t, wstring이 utf-16 문자/문자열을 지원합니다. 아래 문서를 참조하세요.

http://en.cppreference.com/w/cpp/string/wide

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.