codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <locale.h> #define DF_C_PLUS 1 #if DF_C_PLUS #include <iostream> #include <string> #include <iostream> #include <string> #include <sstream> //#include <codecvt> #endif //Error: ‘Getch’ Was Not Declared In This Scope //https://www.dreamincode.net/forums/topic/341445-error-getch-was-not-declared-in-this-scope/ //htons function //https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-htons //WinSock32 //https://social.msdn.microsoft.com/Forums/vstudio/en-US/82ee2e1b-9957-4147-ac31-4e9ac82cbd59/winsock32?forum=vcgeneral // /workspace/test/src/client.c:76: error: ‘_getch’ was not declared in this scope #if DF_C_PLUS using namespace std; #endif #if 0 //[WinAPi]WinAPI를 이용하여 cp949(ANSI) - utf8 인코딩 변환 C/C++ //http://blog.naver.com/PostView.nhn?blogId=nimi315&logNo=50093464158 //UTF-8 을 ANSI 로 변환 (한글 출력에 사용) string utf8_to_ansi(string &utf8) { wchar_t unicode[1500]; char ansi[1500]; memset(unicode, 0, sizeof(unicode)); memset(ansi, 0, sizeof(ansi)); // ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, unicode, sizeof(unicode)); // ::WideCharToMultiByte(CP_ACP, 0, unicode, -1, ansi, sizeof(ansi), NULL, NULL); return string(ansi); } unicode to ansi c++ UNICODE, ANSI 인코딩 변환 http://pyoungon.tistory.com/30 [Pyoungon's Blog] STEP 0: 로케일 설정 (시스템의 기본 언어로 설정) setlocale( LC_ALL, "" ); //STEP 1: 문자 변환 STEP 1-1 ANSI ==> UNICODE mbtowc( UNICODE 문자, ANSI 문자 ); STEP 1-2: UNICODE ==> ANSI wctomb( ANSI 문자, UNICODE 문자 ); //STEP 2: 문자열 변환 STEP 2-1: ANSI ==> UNICODE mbstowcs( UNICODE 문자열, ANSI 문자열, UNICODE 문자열 최대길이 ); STEP 2-2: UNICODE ==> ANSI wcstombs( ANSI 문자열, UNICODE 문자열, ANSI 문자열 최대길이 ); How to convert a UNICODE string to ANSI http://www.cplusplus.com/forum/general/192417/ wcstombs 함수 http://ehpub.co.kr/wcstombs-%ED%95%A8%EC%88%98/ Reload this Page wstring <-> utf8 conversion in pure C++ https://www.linuxquestions.org/questions/programming-9/wstring-utf8-conversion-in-pure-c-701084/ std::codecvt_utf8로 wstring을 utf-8 문자열로 변환 하기 https://jacking75.github.io/std_codecvt_utf8/ C++11 - Convert to/from UTF-8/wchar_t https://ryanclouser.com/2016/08/11/C-11-Convert-to-from-UTF-8-wchar-t/ std::codecvt_utf8 https://en.cppreference.com/w/cpp/locale/codecvt_utf8 wstring_convert wchar_t to utf8 #endif typedef std::string Str; typedef std::wstring WStr; void utf8toWStr(WStr& dest, const Str& src){ dest.clear(); wchar_t w = 0; int bytes = 0; wchar_t err = L'�'; for (size_t i = 0; i < src.size(); i++){ unsigned char c = (unsigned char)src[i]; if (c <= 0x7f){//first byte if (bytes){ dest.push_back(err); bytes = 0; } dest.push_back((wchar_t)c); } else if (c <= 0xbf){//second/third/etc byte if (bytes){ w = ((w << 6)|(c & 0x3f)); bytes--; if (bytes == 0) dest.push_back(w); } else dest.push_back(err); } else if (c <= 0xdf){//2byte sequence start bytes = 1; w = c & 0x1f; } else if (c <= 0xef){//3byte sequence start bytes = 2; w = c & 0x0f; } else if (c <= 0xf7){//3byte sequence start bytes = 3; w = c & 0x07; } else{ dest.push_back(err); bytes = 0; } } if (bytes) dest.push_back(err); } void wstrToUtf8(Str& dest, const WStr& src){ dest.clear(); for (size_t i = 0; i < src.size(); i++){ wchar_t w = src[i]; if (w <= 0x7f) dest.push_back((char)w); else if (w <= 0x7ff){ dest.push_back(0xc0 | ((w >> 6)& 0x1f)); dest.push_back(0x80| (w & 0x3f)); } else if (w <= 0xffff){ dest.push_back(0xe0 | ((w >> 12)& 0x0f)); dest.push_back(0x80| ((w >> 6) & 0x3f)); dest.push_back(0x80| (w & 0x3f)); } else if (w <= 0x10ffff){ dest.push_back(0xf0 | ((w >> 18)& 0x07)); dest.push_back(0x80| ((w >> 12) & 0x3f)); dest.push_back(0x80| ((w >> 6) & 0x3f)); dest.push_back(0x80| (w & 0x3f)); } else dest.push_back('?'); } } Str wstrToUtf8(const WStr& str){ Str result; wstrToUtf8(result, str); return result; } WStr utf8toWStr(const Str& str){ WStr result; utf8toWStr(result, str); return result; } std::ostream& operator<<(std::ostream& f, const WStr& s){ Str s1; wstrToUtf8(s1, s); f << s1; return f; } std::istream& operator>>(std::istream& f, WStr& s){ Str s1; f >> s1; utf8toWStr(s, s1); return f; } bool utf8test(){ WStr w1; //for (wchar_t c = 1; c <= 0x10ffff; c++){ for (wchar_t c = 0x100000; c <= 0x100002; c++){ w1 += c; } Str s = wstrToUtf8(w1); WStr w2 = utf8toWStr(s); bool result = true; if (w1.length() != w2.length()){ printf("length differs\n"); //std::cout << "length differs" << std::endl; result = false; } printf("w1: %ls\ns: %s\nw2: %ls\n", w1.c_str(), s.c_str(), w2.c_str()); for (size_t i = 0; i < w1.size(); i++) if (w1[i] != w2[i]){ result = false; printf("character at pos %x differs (expected %.8x got %.8x)\n", i, w1[i], w2[i]); //std::cout << "character at pos " << i << " differs" << std::endl; break; } if (!result){ printf("utf8 dump: \n"); for (size_t i = 0; i < s.size(); i++) printf("%2x ", (unsigned char)s[i]); } return result; } int main(int argc, char** argv) { //------------------------ // //------------------------ std::wstring ws(L"фыва"); std::string s("фыва"); std::cout << ws << s << std::endl; std::cout << wstrToUtf8(utf8toWStr("фыва")) << std::endl; if (utf8test()) std::cout << "utf8Test succesful" << std::endl; else std::cout << "utf8Test failed" << std::endl; //------------------------ // //------------------------ std::wstring str1(L"막내"); std::wstring str2(L"갑순"); char cho, joong, jong; cho = (str1[1] - 0xAC00) / (21*28); joong = (str1[1] - 0xAC00) % (21 * 28) / 28; jong = (str1[1] - 0xAC00) % 28; std::cout << str1; // std::cout << wstrToUtf8((str1.c_str())) << std::endl; if(jong != 0) { printf("이가\n") ; } else { printf("가\n") ; } cho = (str2[1] - 0xAC00) / (21*28); joong = (str2[1] - 0xAC00) % (21 * 28) / 28; jong = (str2[1] - 0xAC00) % 28; std::cout << str2; // std::cout << wstrToUtf8((str1.c_str())) << std::endl; if(jong != 0) { printf("이가\n") ; } else { printf("가\n") ; } return 0; }
Private
[
?
]
Run code
Submit