[Ttssh2-commit] [7327] ttproxy unicode化

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2018年 12月 15日 (土) 00:41:27 JST


Revision: 7327
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7327
Author:   zmatsuo
Date:     2018-12-15 00:41:26 +0900 (Sat, 15 Dec 2018)
Log Message:
-----------
ttproxy unicode化

Modified Paths:
--------------
    branches/cmake/TTProxy/CMakeLists.txt
    branches/cmake/TTProxy/Logger.h
    branches/cmake/TTProxy/ProxyWSockHook.h
    branches/cmake/TTProxy/SSLLIB.h
    branches/cmake/TTProxy/SSLSocket.h
    branches/cmake/TTProxy/TTProxy.cpp
    branches/cmake/TTProxy/TTProxy.h
    branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h
    branches/cmake/TTProxy/YCL/include/YCL/Dialog.h
    branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h
    branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h
    branches/cmake/TTProxy/YCL/include/YCL/IniFile.h
    branches/cmake/TTProxy/YCL/include/YCL/Integer.h
    branches/cmake/TTProxy/YCL/include/YCL/Resource.h
    branches/cmake/TTProxy/YCL/include/YCL/String.h
    branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h
    branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h
    branches/cmake/TTProxy/YCL/include/YCL/Window.h
    branches/cmake/TTProxy/YCL/include/YCL/common.h
    branches/cmake/teraterm/common/codeconv.cpp
    branches/cmake/teraterm/common/codeconv.h

-------------- next part --------------
Modified: branches/cmake/TTProxy/CMakeLists.txt
===================================================================
--- branches/cmake/TTProxy/CMakeLists.txt	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/CMakeLists.txt	2018-12-14 15:41:26 UTC (rev 7327)
@@ -1,18 +1,33 @@
 project(ttproxy)
 
+if(USE_UNICODE_API)
+  add_definitions(-DUNICODE -D_UNICODE)
+endif()
+
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/")
 
+if(MSVC)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
+endif()
+
 include(${CMAKE_CURRENT_SOURCE_DIR}/../libs/lib_openssl.cmake)
 
 set(COMMON_SRC
   ../teraterm/common/ttlib.h
   ../teraterm/common/i18n.h
+  ../teraterm/common/ttplugin.h
+  ../teraterm/common/tttypes.h
+  ../teraterm/common/tt-version.h
+  ../teraterm/common/codeconv.h
+  ../teraterm/common/codeconv.cpp
+  ../teraterm/common/dlglib.h
+  ../teraterm/common/dlglib.c
+  ../teraterm/common/dlglib_cpp.cpp
+  ../teraterm/common/dlglib_tmpl.cpp
   ../teraterm/teraterm/ttdialog.h
   ../teraterm/teraterm/ttfileio.h
-  ../teraterm/common/ttplugin.h
   ../teraterm/teraterm/ttsetup.h
-  ../teraterm/common/tttypes.h
-  ../teraterm/common/tt-version.h
   ../teraterm/teraterm/ttwsk.h
   )
 source_group(

Modified: branches/cmake/TTProxy/Logger.h
===================================================================
--- branches/cmake/TTProxy/Logger.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/Logger.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -70,7 +70,7 @@
 			WriteFile(logfile, label, strlen(label), &written, NULL);
 			WriteFile(logfile, ": [", 3, &written, NULL);
 			while (size-- > 0) {
-				len = wsprintf(buf, " %02x", *data++);
+				len = wsprintfA(buf, " %02x", *data++);
 				WriteFile(logfile, buf, 3, &written, NULL);
 			}
 			WriteFile(logfile, " ]\r\n", 4, &written, NULL);

Modified: branches/cmake/TTProxy/ProxyWSockHook.h
===================================================================
--- branches/cmake/TTProxy/ProxyWSockHook.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/ProxyWSockHook.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -17,16 +17,23 @@
 
 #include "ttlib.h"
 #include "i18n.h"
+#include "codeconv.h"
+#include "dlglib.h"
 
 extern char UILanguageFile[MAX_PATH];
 
-void UTIL_get_lang_msg(const char *key, PCHAR buf, int buf_len, const char *def)
+void UTIL_get_lang_msg(const char *key, TCHAR *buf, int buf_len, const TCHAR *def)
 {
-    GetI18nStr("TTProxy", key, buf, buf_len, def, UILanguageFile);
+    GetI18nStrT("TTProxy", key, buf, buf_len, def, UILanguageFile);
 }
 
-int UTIL_get_lang_font(const char *key, HWND dlg, PLOGFONT logfont, HFONT *font)
+void UTIL_get_lang_msgU8(const char *key, char *buf, int buf_len, const char *def)
 {
+    GetI18nStrU8("TTProxy", key, buf, buf_len, def, UILanguageFile);
+}
+
+int UTIL_get_lang_font(const char *key, HWND dlg, PLOGFONTA logfont, HFONT *font)
+{
     if (GetI18nLogfont("TTProxy", key, logfont,
                        GetDeviceCaps(GetDC(dlg),LOGPIXELSY),
                        UILanguageFile) == FALSE) {
@@ -33,7 +40,7 @@
         return FALSE;
     }
 
-    if ((*font = CreateFontIndirect(logfont)) == NULL) {
+    if ((*font = CreateFontIndirectA(logfont)) == NULL) {
         return FALSE;
     }
 
@@ -44,7 +51,7 @@
 public:
     class MessageShower {
     public:
-        virtual void showMessage(const char* message)const = 0;
+        virtual void showMessage(const TCHAR* message)const = 0;
     };
 private:
     struct DUMMYHOSTENT {
@@ -136,57 +143,57 @@
     private:
         struct PROXY_TYPE_TABLE {
             Type type;
-            const char* name;
+            const TCHAR* name;
         };
         static const PROXY_TYPE_TABLE* proxy_type_table() {
             static PROXY_TYPE_TABLE table[] = {
-                {TYPE_HTTP,   "http"},
-                {TYPE_SOCKS5, "socks"},
-                {TYPE_SOCKS4, "socks4"},
-                {TYPE_TELNET, "telnet"},
-                {TYPE_SOCKS5, "socks5"},
-                {TYPE_NONE_FORCE, "none"},
-                {TYPE_HTTP_SSL,   "http+ssl"},
-                {TYPE_SOCKS5_SSL, "socks+ssl"},
-                {TYPE_SOCKS4_SSL, "socks4+ssl"},
-                {TYPE_TELNET_SSL, "telnet+ssl"},
-                {TYPE_SOCKS5_SSL, "socks5+ssl"},
-                {TYPE_SSL, "ssl"},
-                {TYPE_SSL, "none+ssl"},
+                {TYPE_HTTP,   _T("http")},
+                {TYPE_SOCKS5, _T("socks")},
+                {TYPE_SOCKS4, _T("socks4")},
+                {TYPE_TELNET, _T("telnet")},
+                {TYPE_SOCKS5, _T("socks5")},
+                {TYPE_NONE_FORCE, _T("none")},
+                {TYPE_HTTP_SSL,   _T("http+ssl")},
+                {TYPE_SOCKS5_SSL, _T("socks+ssl")},
+                {TYPE_SOCKS4_SSL, _T("socks4+ssl")},
+                {TYPE_TELNET_SSL, _T("telnet+ssl")},
+                {TYPE_SOCKS5_SSL, _T("socks5+ssl")},
+                {TYPE_SSL, _T("ssl")},
+                {TYPE_SSL, _T("none+ssl")},
                 {TYPE_NONE, NULL},
             };
             return table;
         }
     public:
-        static Type parseType(const char* string) {
-            return parseType(string, string + strlen(string));
+        static Type parseType(const TCHAR* string) {
+            return parseType(string, string + _tcslen(string));
         }
-        static Type parseType(const char* string, const char* end) {
+        static Type parseType(const TCHAR* string, const TCHAR* end) {
             int length = end - string;
-            char* buffer = (char*) alloca(length + 1);
-            char* dst = buffer;
+            TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * (length + 1));
+            TCHAR* dst = buffer;
             while (length-- > 0 && *string != '\0') {
-                int ch = *string++;
-                if ('A' <= ch && ch <= 'Z') {
-                    ch += 'a' - 'A';
+                TCHAR ch = *string++;
+                if (_T('A') <= ch && ch <= _T('Z')) {
+                    ch += _T('a') - _T('A');
                 }
                 *dst++ = ch;
             }
-            *dst = '\0';
+            *dst = _T('\0');
             const PROXY_TYPE_TABLE* table = proxy_type_table();
             bool ssl_enabled = SSLSocket::isEnabled();
             while (table->name != NULL) {
-                if (!ssl_enabled && strstr(table->name, "ssl") != NULL) {
+                if (!ssl_enabled && _tcsstr(table->name, _T("ssl")) != NULL) {
                     table++;
                     continue;
                 }
-                if (strcmp(buffer, table->name) == 0)
+                if (_tcscmp(buffer, table->name) == 0)
                     return table->type;
                 table++;
             }
             return TYPE_NONE;
         }
-        static const char* getTypeName(Type type) {
+        static const TCHAR* getTypeName(Type type) {
             if (type != TYPE_NONE && type != TYPE_NONE_FORCE) {
                 const PROXY_TYPE_TABLE* table = proxy_type_table();
                 while (table->name != NULL) {
@@ -198,10 +205,10 @@
             return NULL;
         }
 
-        static int parsePort(const char* string) {
-            return parsePort(string, string + strlen(string));
+        static int parsePort(const TCHAR* string) {
+            return parsePort(string, string + _tcslen(string));
         }
-        static int parsePort(const char* string, const char* end) {
+        static int parsePort(const TCHAR* string, const TCHAR* end) {
             if (string > end || *string < '1' || '9' < *string)
                 return -1;
             int digit = 0;
@@ -276,8 +283,8 @@
             return url;
         }
 #else
-        static String parse(const char* url, ProxyInfo& proxy) {
-            char* p = strstr((char*) url, "://");
+        static String parse(const TCHAR* url, ProxyInfo& proxy) {
+            TCHAR* p = _tcsstr((TCHAR*) url, _T("://"));
             if (p == NULL) {
                 proxy.type = TYPE_NONE;
                 return NULL;
@@ -286,7 +293,7 @@
             if (proxy.type == TYPE_NONE)
                 return NULL;
             p += 3;
-            const char* start = p;
+            const TCHAR* start = p;
 
             // user:pass \x82\xAA\x82\xA0\x82\xEA\x82Ίi\x94[\x82\xB7\x82\xE9
             String tmp = String(start);
@@ -352,7 +359,7 @@
                 return NULL;
             StringBuffer buffer;
             buffer.append(getTypeName(type));
-            buffer.append("://");
+            buffer.append(_T("://"));
             if (type != TYPE_SSL) {
                 if (user != NULL) {
                     urlencode(user, buffer);
@@ -366,9 +373,9 @@
                     buffer.append(host);
                 }
                 else {
-                    buffer.append("[");
+                    buffer.append(_T("["));
                     buffer.append(host);
-                    buffer.append("]");
+                    buffer.append(_T("]"));
                 }
                 if (port != 0) {
                     buffer.append(':');
@@ -398,9 +405,9 @@
             }
         }
 
-        static String urldecode(const char* start, const char* end) {
-            char* buffer = (char*) alloca((end - start) * 3 + 1);
-            char* dst = buffer;
+        static String urldecode(const TCHAR* start, const TCHAR* end) {
+            TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * ((end - start) * 3 + 1));
+            TCHAR* dst = buffer;
             int c1, c2;
             while (start < end) {
                 if (*start == '%' && start + 2 < end && (c1 = hexdigit(start[1])) != -1 && (c2 = hexdigit(start[2])) != -1) {
@@ -407,9 +414,11 @@
                     *dst++ = (char) (c1 << 4 | c2);
                     start += 3;
                 }else{
-                    if (IsDBCSLeadByte(*start)) {
+#if !defined(UNICODE)
+                    if (::IsDBCSLeadByte(*start)) {
                         *dst++ = *start++;
                     }
+#endif
                     *dst++ = *start++;
                 }
             }
@@ -416,16 +425,18 @@
             *dst = '\0';
             return buffer;
         }
-        static String urlencode(const char* string, StringBuffer& buffer) {
-            static const char table[] = "0123456789ABCDEF";
-            const char* start = string;
+        static String urlencode(const TCHAR* string, StringBuffer& buffer) {
+            static const TCHAR table[] = _T("0123456789ABCDEF");
+            const TCHAR* start = string;
             while (*string != '\0') {
                 if ('0' <= *string && *string <= '9'
                     || 'A' <= *string && *string <= 'Z'
                     || 'a' <= *string && *string <= 'z'
                     || *string == '-' || *string == '.' || *string == '_') {
+#if !defined(UNICODE)
                 }else if (::IsDBCSLeadByte(*string)) {
                     string++;
+#endif
                 }else{
                     if (start < string) {
                         buffer.append(start, string - start);
@@ -485,26 +496,26 @@
         ~ConnectionInfo() {
             delete[] buffer;
         }
-        void fillBuffer(char* buffer, int bufferLength) {
-          fillBuffer(buffer, bufferLength, "ssh");
+        void fillBuffer(char* _buffer, int bufferLength) {
+          fillBuffer(_buffer, bufferLength, "ssh");
         }
-        void fillBuffer(char* buffer, int bufferLength, const char *portname) {
-          fillBuffer(buffer, bufferLength, "ssh", AF_UNSPEC);
+        void fillBuffer(char* _buffer, int bufferLength, const char *portname) {
+          fillBuffer(_buffer, bufferLength, "ssh", AF_UNSPEC);
         }
-        void fillBuffer(char* buffer, int bufferLength, const char *portname, int addr_family) {
-            struct servent* sv;
+        void fillBuffer(char* _buffer, int bufferLength, const char *portname, int addr_family) {
+            struct servent* sv = getservbyname(portname, "tcp");
             struct addrinfo* res;
             struct addrinfo* res0;
             struct addrinfo hints;
             int portnum = 0;
-            if (sv = getservbyname(portname, "tcp")) {
+            if (sv) {
               portnum = sv->s_port;
             }
             else {
               portnum = atoi(portname);
             }
-            memset(buffer, 0, bufferLength);
-            DUMMYHOSTENT* dst = (DUMMYHOSTENT*) buffer;
+            memset(_buffer, 0, bufferLength);
+            DUMMYHOSTENT* dst = (DUMMYHOSTENT*) _buffer;
             dst->addr = addr;
             dst->addr6 = addr6;
             dst->addrlist[0] = (char*) &dst->addr;
@@ -554,7 +565,7 @@
                 case AF_UNSPEC:
                 default:
                     memset(&hints, 0, sizeof hints);
-                    getaddrinfo(proxy.host, NULL, &hints, &res0);
+                    getaddrinfo((u8)proxy.host, NULL, &hints, &res0);
                     if (res0) {
                         int flag = 0;
                         for (res = res0; res; res = res->ai_next) {
@@ -591,7 +602,7 @@
                     break;
             }
 
-            strcpy_s(dst->hostname, bufferLength - sizeof (DUMMYHOSTENT), realhost);
+            strcpy_s(dst->hostname, bufferLength - sizeof (DUMMYHOSTENT), (u8)realhost);
         }
     };
     class ConnectionInfoHolder {
@@ -665,7 +676,7 @@
             ::LeaveCriticalSection(&section);
             return info;
         }
-        ConnectionInfo* find(const char* url) {
+        ConnectionInfo* find(const TCHAR* url) {
             ::EnterCriticalSection(&section);
             ConnectionInfo* info = table.get(url);
             ::LeaveCriticalSection(&section);
@@ -734,20 +745,18 @@
     protected:
         virtual bool dispatch(int message, int wParam, long lParam) {
             if (message == WM_COMMAND && wParam == MAKEWPARAM(IDC_REFER, BN_CLICKED)) {
-                char buffer[1024];
-                char uimsg[MAX_UIMSG];
-                OPENFILENAME ofn = {
-                    sizeof ofn,
-                    *this,
-                };
+                TCHAR buffer[1024];
+                TCHAR uimsg[MAX_UIMSG];
+                OPENFILENAME ofn;
+                ofn.lStructSize = sizeof(ofn);
                 ofn.lpstrFile = buffer;
                 ofn.nMaxFile = countof(buffer);
                 ofn.Flags = OFN_LONGNAMES | OFN_NONETWORKBUTTON | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN | OFN_HIDEREADONLY;
-                UTIL_get_lang_msg("MSG_LOGFILE_SELECT", uimsg, sizeof(uimsg),
-                                  "Select Logfile");
+                UTIL_get_lang_msg("MSG_LOGFILE_SELECT", uimsg, _countof(uimsg),
+                                  _T("Select Logfile"));
                 ofn.lpstrTitle = uimsg;
                 if (logfile != NULL) {
-                    strcpy_s(buffer, sizeof buffer, logfile);
+                    _tcscpy_s(buffer, _countof(buffer), (tc)logfile);
                 }else{
                     buffer[0] = '\0';
                 }
@@ -764,14 +773,33 @@
             return Dialog::dispatch(message, wParam, lParam);
         }
         virtual bool onInitDialog() {
-            char uimsg[MAX_UIMSG], uitmp[MAX_UIMSG];
-            LOGFONT logfont;
+            const static DlgTextInfo text_info[] = {
+                { 0, "DLG_OTHER_TITLE" },
+                { IDC_GRP_COMMON, "DLG_OTHER_COMMON" },
+                { IDC_TIMEOUT_LABEL, "DLG_OTHER_TIMEOUT" },
+                { IDC_TIMEOUT_SECONDS, "DLG_OTHER_SECOND" },
+                { IDC_LOGFILE_LABEL, "DLG_OTHER_LOG" },
+                { IDC_REFER, "DLG_OTHER_REFER" },
+                { IDC_GRP_SOCKS, "DLG_OTHER_SOCKS" },
+                { IDC_RESOLVE_LABEL, "DLG_OTHER_RESOLV" },
+                { IDC_GRP_TELNET, "DLG_OTHER_TELNET" },
+                { IDC_HOSTNAME_LABEL, "DLG_OTHER_HOST" },
+                { IDC_USERNAME_LABEL, "DLG_OTHER_USER" },
+                { IDC_PASSWORD_LABEL, "DLG_OTHER_PASS" },
+                { IDC_CONNECTED_LABEL, "DLG_OTHER_CONNECT" },
+                { IDC_ERROR_LABEL, "DLG_OTHER_ERROR" },
+//              { IDOK, "BTN_OK" },
+//              { IDCANCEL, "BTN_CANCEL" },
+            };
+            TCHAR uimsg[MAX_UIMSG];
+//			TCHAR uitmp[MAX_UIMSG];
+            LOGFONTA logfont;
             HFONT font;
 
             Dialog::onInitDialog();
 
             font = (HFONT)SendMessage(WM_GETFONT, 0, 0);
-            GetObject(font, sizeof(LOGFONT), &logfont);
+            GetObject(font, sizeof(logfont), &logfont);
             if (UTIL_get_lang_font("DLG_TAHOMA_FONT", HWND(), &logfont, &DlgFont)) {
                 SendDlgItemMessage(IDC_GRP_COMMON, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0));
                 SendDlgItemMessage(IDC_TIMEOUT_LABEL, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0));
@@ -801,6 +829,9 @@
                 DlgFont = NULL;
             }
 
+            HWND hWnd = (HWND)this;
+            SetDlgTexts(hWnd, text_info, _countof(text_info), UILanguageFile);
+#if 0
             GetWindowText(uitmp, sizeof(uitmp));
             UTIL_get_lang_msg("DLG_OTHER_TITLE", uimsg, sizeof(uimsg), uitmp);
             SetWindowText(uimsg);
@@ -849,6 +880,7 @@
             GetDlgItemText(IDCANCEL, uitmp, sizeof(uitmp));
             UTIL_get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uitmp);
             SetDlgItemText(IDCANCEL, uimsg);
+#endif
 
             host = GetDlgItem(IDC_HOSTNAME);
             user = GetDlgItem(IDC_USERNAME);
@@ -860,22 +892,22 @@
             SetDlgItemInt(IDC_TIMEOUT, timeout, false);
 
             resolveCombo <<= GetDlgItem(IDC_RESOLVE);
-            UTIL_get_lang_msg("DLG_OTHER_RESOLV_AUTO", uimsg, sizeof(uimsg), "auto resolve");
+            UTIL_get_lang_msg("DLG_OTHER_RESOLV_AUTO", uimsg, _countof(uimsg), _T("auto resolve"));
             resolveCombo.addString(uimsg);
-            UTIL_get_lang_msg("DLG_OTHER_RESOLV_REMOTE", uimsg, sizeof(uimsg), "resolve remote");
+            UTIL_get_lang_msg("DLG_OTHER_RESOLV_REMOTE", uimsg, _countof(uimsg), _T("resolve remote"));
             resolveCombo.addString(uimsg);
-            UTIL_get_lang_msg("DLG_OTHER_RESOLV_LOCAL", uimsg, sizeof(uimsg), "resolve local");
+            UTIL_get_lang_msg("DLG_OTHER_RESOLV_LOCAL", uimsg, _countof(uimsg), _T("resolve local"));
             resolveCombo.addString(uimsg);
             resolveCombo.setCurSel(resolve);
 
-            host.SetWindowText(HostnamePrompt);
-            user.SetWindowText(UsernamePrompt);
-            pass.SetWindowText(PasswordPrompt);
-            conn.SetWindowText(ConnectedMessage);
-            erro.SetWindowText(ErrorMessage);
+            host.SetWindowText((tc)HostnamePrompt);
+            user.SetWindowText((tc)UsernamePrompt);
+            pass.SetWindowText((tc)PasswordPrompt);
+            conn.SetWindowText((tc)ConnectedMessage);
+            erro.SetWindowText((tc)ErrorMessage);
 
             if (logfile != NULL)
-                log.SetWindowText(logfile);
+                log.SetWindowText((tc)logfile);
 
             return true;
         }
@@ -885,9 +917,9 @@
                 || pass.GetWindowTextLength() == 0
                 || conn.GetWindowTextLength() == 0
                 || erro.GetWindowTextLength() == 0) {
-                char uimsg[MAX_UIMSG];
-                UTIL_get_lang_msg("MSG_EMPTY_PARAMETER", uimsg, sizeof(uimsg),
-                                  "Some parameters are empty!");
+                TCHAR uimsg[MAX_UIMSG];
+                UTIL_get_lang_msg("MSG_EMPTY_PARAMETER", uimsg, _countof(uimsg),
+                                  _T("Some parameters are empty!"));
                 MessageBox(uimsg, FileVersion::getOwnVersion().getProductName(), MB_OK | MB_ICONERROR);
                 return;
             }
@@ -962,14 +994,15 @@
             return Dialog::dispatch(message, wParam, lParam);
         }
         virtual bool onInitDialog() {
-            char uimsg[MAX_UIMSG], uitmp[MAX_UIMSG];
-            LOGFONT logfont;
+            TCHAR uimsg[MAX_UIMSG];
+//			TCHAR uitmp[MAX_UIMSG];
+            LOGFONTA logfont;
             HFONT font;
 
             Dialog::onInitDialog();
 
             font = (HFONT)SendMessage(WM_GETFONT, 0, 0);
-            GetObject(font, sizeof(LOGFONT), &logfont);
+            GetObject(font, sizeof(logfont), &logfont);
             if (UTIL_get_lang_font("DLG_TAHOMA_FONT", HWND(), &logfont, &DlgFont)) {
                 SendDlgItemMessage(IDC_URL_LABEL, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0));
                 SendDlgItemMessage(IDC_URL, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0));
@@ -991,8 +1024,23 @@
                 DlgFont = NULL;
             }
 
+            const static DlgTextInfo text_info[] = {
+                { 0, "DLG_SETUP_TITLE" },
+                { IDC_URL_LABEL, "DLG_SETUP_URL" },
+                { IDC_TYPE_LEBEL, "DLG_SETUP_TYPE" },
+                { IDC_HOSTNAME_LABEL, "DLG_SETUP_HOST" },
+                { IDC_PORT_LABEL, "DLG_SETUP_PORT" },
+                { IDC_USERNAME_LABEL, "DLG_SETUP_USER" },
+                { IDC_PASSWORD_LABEL, "DLG_SETUP_PASS" },
+                { IDC_OPTIONS, "DLG_SETUP_OTHER" },
+//              { IDOK, "BTN_OK" },
+//              { IDCANCEL, "BTN_CANCEL" },
+            };
+            HWND hWnd = (HWND)this;
+            SetDlgTexts(hWnd, text_info, _countof(text_info), UILanguageFile);
+#if 0
             GetWindowText(uitmp, sizeof(uitmp));
-            UTIL_get_lang_msg("DLG_SETUP_TITLE", uimsg, sizeof(uimsg), uitmp);
+            UTIL_get_lang_msgT("DLG_SETUP_TITLE", uimsg, sizeof(uimsg), uitmp);
             SetWindowText(uimsg);
             GetDlgItemText(IDC_URL_LABEL, uitmp, sizeof(uitmp));
             UTIL_get_lang_msg("DLG_SETUP_URL", uimsg, sizeof(uimsg), uitmp);
@@ -1021,7 +1069,7 @@
             GetDlgItemText(IDCANCEL, uitmp, sizeof(uitmp));
             UTIL_get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uitmp);
             SetDlgItemText(IDCANCEL, uimsg);
-
+#endif
             url  <<= GetDlgItem(IDC_URL);
             type <<= GetDlgItem(IDC_TYPE);
             host <<= GetDlgItem(IDC_HOSTNAME);
@@ -1030,18 +1078,18 @@
             pass <<= GetDlgItem(IDC_PASSWORD);
 
             lock = true;
-            UTIL_get_lang_msg("MSG_TYPE_NONE", uimsg, sizeof(uimsg), "Without Proxy");
+            UTIL_get_lang_msg("MSG_TYPE_NONE", uimsg, _countof(uimsg), __T("Without Proxy"));
             type.addString(uimsg);
-            type.addString("HTTP");
-            type.addString("TELNET");
-            type.addString("SOCKS4");
-            type.addString("SOCKS5");
+            type.addString(_T("HTTP"));
+            type.addString(_T("TELNET"));
+            type.addString(_T("SOCKS4"));
+            type.addString(_T("SOCKS5"));
             if (SSLSocket::isEnabled()) {
-                type.addString("SSL");
-                type.addString("HTTP+SSL");
-                type.addString("TELNET+SSL");
-                type.addString("SOCKS4+SSL");
-                type.addString("SOCKS5+SSL");
+                type.addString(_T("SSL"));
+                type.addString(_T("HTTP+SSL"));
+                type.addString(_T("TELNET+SSL"));
+                type.addString(_T("SOCKS4+SSL"));
+                type.addString(_T("SOCKS5+SSL"));
             }
             type.setCurSel(proxy.type);
 
@@ -1049,8 +1097,8 @@
                 if (proxy.host != NULL) {
                     host.SetWindowText(proxy.host);
                     if (proxy.port != 0) {
-                        char buffer[16];
-                        _itoa_s(proxy.port, buffer, sizeof buffer, 10);
+                        TCHAR buffer[16];
+                        _itot_s(proxy.port, buffer, _countof(buffer), 10);
                         port.SetWindowText(buffer);
                     }
                     if (proxy.user != NULL) {
@@ -1066,17 +1114,17 @@
             return true;
         }
         virtual void onOK() {
-            char uimsg[MAX_UIMSG];
+            TCHAR uimsg[MAX_UIMSG];
             if (proxy.type != ProxyInfo::TYPE_NONE && proxy.type != ProxyInfo::TYPE_SSL) {
                 if (proxy.host == NULL) {
-                    UTIL_get_lang_msg("MSG_EMPTY_HOSTNAME", uimsg, sizeof(uimsg),
-                                      "Hostname is empty!");
+                    UTIL_get_lang_msg("MSG_EMPTY_HOSTNAME", uimsg, _countof(uimsg),
+                                      _T("Hostname is empty!"));
                     MessageBox(uimsg, FileVersion::getOwnVersion().getProductName(), MB_OK | MB_ICONERROR);
                     return;
                 }
                 if (port.GetWindowTextLength() != 0 && proxy.port <= 0) {
-                    UTIL_get_lang_msg("MSG_ILLEGAL_PORT", uimsg, sizeof(uimsg),
-                                      "Illegal port number!");
+                    UTIL_get_lang_msg("MSG_ILLEGAL_PORT", uimsg, _countof(uimsg),
+                                      _T("Illegal port number!"));
                     MessageBox(uimsg, FileVersion::getOwnVersion().getProductName(), MB_OK | MB_ICONERROR);
                     return;
                 }
@@ -1177,9 +1225,9 @@
             }
             String urlS = proxy.generateURL();
             if (urlS == NULL) {
-                urlS = "none:///";
+                urlS = _T("none:///");
             }
-            url.SetWindowText(urlS);
+            url.SetWindowText((tc)urlS);
         }
     public:
         ProxyInfo proxy;
@@ -1197,15 +1245,15 @@
         HFONT DlgFont;
         virtual bool onInitDialog() {
             String buf;
-            char *buf2;
-            const char *ver;
+            TCHAR *buf2;
+            const TCHAR *ver;
             int n, a, b, c, d, len;
-            char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG], uimsg3[MAX_UIMSG];
-            LOGFONT logfont;
+            TCHAR uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG], uimsg3[MAX_UIMSG];
+            LOGFONTA logfont;
             HFONT font;
 
             font = (HFONT)SendMessage(WM_GETFONT, 0, 0);
-            GetObject(font, sizeof(LOGFONT), &logfont);
+            GetObject(font, sizeof(logfont), &logfont);
             if (UTIL_get_lang_font("DLG_TAHOMA_FONT", HWND(), &logfont, &DlgFont)) {
                 SendDlgItemMessage(IDC_VERSION, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0));
                 SendDlgItemMessage(IDOK, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0));
@@ -1214,31 +1262,31 @@
                 DlgFont = NULL;
             }
 
-            GetWindowText(uimsg2, sizeof(uimsg2));
-            UTIL_get_lang_msg("DLG_ABOUT_TITLE", uimsg, sizeof(uimsg), uimsg2);
+            GetWindowText(uimsg2, _countof(uimsg2));
+            UTIL_get_lang_msg("DLG_ABOUT_TITLE", uimsg, _countof(uimsg), uimsg2);
             SetWindowText(uimsg);
 
-            UTIL_get_lang_msg("DLG_ABOUT_EXTENSION", uimsg, sizeof(uimsg),
-                              "Tera Term proxy extension");
-            UTIL_get_lang_msg("DLG_ABOUT_YEBISUYA", uimsg2, sizeof(uimsg2),
-                              "YebisuyaHompo");
-            UTIL_get_lang_msg("DLG_ABOUT_HOMEPAGE", uimsg3, sizeof(uimsg3),
-                              "TTProxy home page");
+            UTIL_get_lang_msg("DLG_ABOUT_EXTENSION", uimsg, _countof(uimsg),
+                              _T("Tera Term proxy extension"));
+            UTIL_get_lang_msg("DLG_ABOUT_YEBISUYA", uimsg2, _countof(uimsg2),
+                              _T("YebisuyaHompo"));
+            UTIL_get_lang_msg("DLG_ABOUT_HOMEPAGE", uimsg3, _countof(uimsg3),
+                              _T("TTProxy home page"));
             buf = GetDlgItemText(IDC_VERSION);
             len = buf.length() + 50;
-            buf2 = (char *)_alloca(len);
+            buf2 = (TCHAR *)_alloca(sizeof(TCHAR) * len);
             if (buf2 == NULL) {
                 return true;
             }
             ver = FileVersion::getOwnVersion().getFileVersion();
-            n = sscanf_s(ver, "%d, %d, %d, %d", &a, &b, &c, &d);
+            n = _stscanf_s(ver, _T("%d, %d, %d, %d"), &a, &b, &c, &d);
             if (n == 4) {
-                sprintf_s(buf2, len, buf, uimsg, a, b, c, d, uimsg2, uimsg3);
+                _stprintf_s(buf2, len, buf, uimsg, a, b, c, d, uimsg2, uimsg3);
             }
             SetDlgItemText(IDC_VERSION, (n == 4) ? buf2 : buf);
 
-            GetDlgItemText(IDOK, uimsg, sizeof(uimsg));
-            UTIL_get_lang_msg("BTN_OK", uimsg, sizeof(uimsg),"OK");
+            GetDlgItemText(IDOK, uimsg, _countof(uimsg));
+            UTIL_get_lang_msg("BTN_OK", uimsg, _countof(uimsg), _T("OK"));
             SetDlgItemText(IDOK, uimsg);
 
             return true;
@@ -1277,7 +1325,6 @@
     }
 
     int sendToSocket(SOCKET s, const unsigned char* buffer, int size) {
-        int i = 0;
         Logger::log("send", buffer, size);
         return _sendToSocket(s, buffer, size);
     }
@@ -1287,20 +1334,20 @@
         int len;
         va_list arglist;
         va_start(arglist, format);
-        len = wvsprintf(buf, format, arglist);
+        len = wvsprintfA(buf, format, arglist);
         va_end(arglist);
         Logger::log("send", buf);
         return _sendToSocket(s, (const unsigned char*) buf, len);
     }
 
-    int recieveFromSocketTimeout(SOCKET s, unsigned char* buffer, int size, int timeout) {
+    int recieveFromSocketTimeout(SOCKET s, unsigned char* buffer, int size, int _timeout) {
         int ready = 0;
         while (!ready) {
-            struct timeval tv = {timeout, 0};
+            struct timeval tv = {_timeout, 0};
             fd_set fd;
             FD_ZERO(&fd);
             FD_SET(s, &fd);
-            switch (select((int) (s + 1), &fd, NULL, NULL, timeout > 0 ? &tv : NULL)) {
+            switch (select((int) (s + 1), &fd, NULL, NULL, _timeout > 0 ? &tv : NULL)) {
             case SOCKET_ERROR:
                 return SOCKET_ERROR;
             case 0:
@@ -1348,13 +1395,13 @@
         return 0;
     }
 
-    int wait_for_prompt(SOCKET s, String prompts[], int count, int timeout /* sec */) {
+    int wait_for_prompt(SOCKET s, String prompts[], int count, int _timeout /* sec */) {
         char buf[1024];
         while (1) {
             char *dst = buf;
             char *end = buf + sizeof buf - 1;
             while (dst < end) {
-                switch (recieveFromSocketTimeout(s, (unsigned char*) dst, 1, timeout)) {    /* recv one-by-one */
+                switch (recieveFromSocketTimeout(s, (unsigned char*) dst, 1, _timeout)) {    /* recv one-by-one */
                 case SOCKET_ERROR:
                     if (WSAGetLastError() != WSAEWOULDBLOCK) {
                         return SOCKET_ERROR;
@@ -1376,7 +1423,8 @@
                 *dst = '\0';
                 Logger::log("recv", buf);
                 for (i = 0; i < count; i++) {
-                    char* found = strstr(buf, prompts[i]);
+                    u8 promptU8 = (const TCHAR *)prompts[i];
+                    char* found = strstr(buf, promptU8);
                     if (found != NULL) {
                         return i;
                     }
@@ -1389,13 +1437,16 @@
         static const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
         char buf[1024];
         int status_code;
-        if (sendToSocketFormat(s, strchr(realhost,':')?"CONNECT [%s]:%d HTTP/1.1\r\n":"CONNECT %s:%d HTTP/1.1\r\n", (const char *)realhost, realport) == SOCKET_ERROR)
+        u8 realhostU8 = (const TCHAR *)realhost;
+        if (sendToSocketFormat(s, strchr((const char *)realhostU8,':')?"CONNECT [%s]:%d HTTP/1.1\r\n":"CONNECT %s:%d HTTP/1.1\r\n", (const char *)realhostU8, realport) == SOCKET_ERROR)
             return SOCKET_ERROR;
-        if (sendToSocketFormat(s, strchr(realhost,':')?"Host: [%s]:%d\r\n":"Host: %s:%d\r\n", (const char *)realhost, realport) == SOCKET_ERROR)
+        if (sendToSocketFormat(s, strchr((const char *)realhostU8,':')?"Host: [%s]:%d\r\n":"Host: %s:%d\r\n", (const char *)realhostU8, realport) == SOCKET_ERROR)
             return SOCKET_ERROR;
         if (proxy.user != NULL) {
-            int userlen = strlen(proxy.user);
-            int passlen = strlen(proxy.pass);
+            u8 proxy_user = (const TCHAR *)proxy.user;
+            u8 proxy_pass = (const TCHAR *)proxy.pass;
+            int userlen = strlen(proxy_user);
+            int passlen = strlen(proxy_pass);
             int authlen = userlen + 1 + passlen;
             int encodedlen = (authlen + 2) / 3 * 4;
             char* auth = (char*) alloca(authlen + 1);
@@ -1404,10 +1455,10 @@
             char *dst = encoded;
             int bits = 0;
             int data = 0;
-            strcpy_s(auth, authlen + 1, proxy.user);
+            strcpy_s(auth, authlen + 1, proxy_user);
             auth[userlen] = ':';
-            strcpy_s(auth + userlen + 1, passlen + 1, proxy.pass);
-        
+            strcpy_s(auth + userlen + 1, passlen + 1, proxy_pass);
+
             /* make base64 string */
             while (*src != '\0') {
                 data = (data << 8) | *src++;
@@ -1422,7 +1473,7 @@
                 *dst++ = base64_table[0x3F & (data << (6 - bits))];
                 encodedlen--;
             }
-            while (encodedlen-- > 0) { 
+            while (encodedlen-- > 0) {
                 *dst++ = '=';
             }
             *dst = '\0';
@@ -1441,12 +1492,12 @@
             }
         } while (strcmp(buf,"\r\n") != 0);
         if (status_code != 200) {
-            char uimsg[MAX_UIMSG];
+            TCHAR uimsg[MAX_UIMSG];
             switch (status_code) {
             case 401:
             case 407:
                 UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, sizeof(uimsg),
-                                  "Proxy authorization failed!");
+                                  _T("Proxy authorization failed!"));
                 break;
             case 400:
             case 405:
@@ -1453,7 +1504,7 @@
             case 406:
             case 403:
                 UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                                  "Proxy prevent this connection!");
+                                  _T("Proxy prevent this connection!"));
                 break;
             }
             return setError(s, uimsg);
@@ -1496,7 +1547,10 @@
         int auth_result;
         unsigned char buf[256];
         unsigned char* ptr = buf;
-        char uimsg[MAX_UIMSG];
+        TCHAR uimsg[MAX_UIMSG];
+        u8 proxy_user = (const TCHAR *)proxy.user;
+        u8 proxy_pass = (const TCHAR *)proxy.pass;
+        u8 realhostU8 = (const TCHAR *)realhost;
         *ptr++ = SOCKS5_VERSION;
         if (proxy.user != NULL && proxy.pass != NULL) {
             *ptr++ = 2; // support 2 auth methods : SOCKS5_AUTH_NOAUTH, SOCKS5_AUTH_USERPASS
@@ -1512,9 +1566,8 @@
             return SOCKET_ERROR;
 
         if (buf[0] != SOCKS5_VERSION || buf[1] == SOCKS5_REJECT) {
-            char uimsg[MAX_UIMSG];
             UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                              "Proxy prevent this connection!");
+                              _T("Proxy prevent this connection!"));
             return setError(s, uimsg);
         }
         auth_method = buf[1];
@@ -1529,19 +1582,19 @@
             /* make authentication packet */
             ptr = buf;
             *ptr++ = SOCKS5_AUTH_SUBNEGOVER;
-            len = proxy.user.length();
+            len = strlen(proxy_user);
             *ptr++ = len;
-            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy.user);
+            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy_user);
             ptr += len;
-            len = proxy.pass.length();
+            len = strlen(proxy_pass);
             *ptr++ = len;
-            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy.pass);
+            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy_pass);
             ptr += len;
 
             /* send it and get answer */
-            if (sendToSocket(s, buf, ptr - buf) == SOCKET_ERROR) 
+            if (sendToSocket(s, buf, ptr - buf) == SOCKET_ERROR)
                 return SOCKET_ERROR;
-            if (recieveFromSocket(s, buf, 2) == SOCKET_ERROR) 
+            if (recieveFromSocket(s, buf, 2) == SOCKET_ERROR)
                 return SOCKET_ERROR;
 
             /* check status */
@@ -1549,7 +1602,7 @@
             break;
         default:
             UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                              "Proxy prevent this connection!");
+                              _T("Proxy prevent this connection!"));
             return setError(s, uimsg);
         }
         if (auth_result == SOCKET_ERROR) {
@@ -1556,7 +1609,7 @@
             return SOCKET_ERROR;
         }else if (auth_result != 0) {
             UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, sizeof(uimsg),
-                              "Proxy authorization failed!");
+                              _T("Proxy authorization failed!"));
             return setError(s, uimsg);
         }
         /* request to connect */
@@ -1567,7 +1620,7 @@
         struct addrinfo hints, *res = NULL;
         if (resolve != RESOLVE_REMOTE) {
             memset(&hints, 0, sizeof(hints));
-            getaddrinfo(realhost, NULL, &hints, &res);
+            getaddrinfo(realhostU8, NULL, &hints, &res);
         }
         if (res) {
             switch (res->ai_family) {
@@ -1584,6 +1637,7 @@
               default:
                 freeaddrinfo(res);
                 WSASetLastError(WSAECONNREFUSED);
+
                 return SOCKET_ERROR;
                 break;
             }
@@ -1595,9 +1649,9 @@
         }
         else {
             *ptr++ = SOCKS5_ATYP_DOMAINNAME;
-            len = strlen(realhost);
+            len = strlen(realhostU8);
             *ptr++ = len;
-            memcpy(ptr, realhost, len);
+            memcpy(ptr, realhostU8, len);
             ptr += len;
         }
         *ptr++ = realport >> 8;     /* DST.PORT */
@@ -1608,7 +1662,7 @@
             return SOCKET_ERROR;
         if (buf[0] != SOCKS5_VERSION || buf[1] != SOCKS5_REP_SUCCEEDED) {   /* check reply code */
             UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                              "Proxy prevent this connection!");
+                              _T("Proxy prevent this connection!"));
             return setError(s, uimsg);
         }
         // buf[2] is reserved
@@ -1647,8 +1701,8 @@
 
     int begin_relay_socks4(ProxyInfo& proxy, String realhost, unsigned short realport, SOCKET s) {
         unsigned char buf[256], *ptr;
-
-        /* make connect request packet 
+        u8 realhostU8 = (const TCHAR *)realhost;
+        /* make connect request packet
            protocol v4:
              VN:1, CD:1, PORT:2, ADDR:4, USER:n, NULL:1
            protocol v4a:
@@ -1661,15 +1715,15 @@
         *ptr++ = realport & 0xFF;
         in_addr addr;
         addr.s_addr = INADDR_NONE;
-        char ch = realhost.charAt(0);
+        char ch = *(const char *)realhostU8;
         if ('0' <= ch && ch <= '9') {
-            addr.s_addr = inet_addr(realhost);
+            addr.s_addr = inet_addr(realhostU8);
         }
         if (addr.s_addr != INADDR_NONE) {
             memcpy(ptr, &addr, sizeof addr);
             ptr += sizeof addr;
         }else{
-            struct hostent* entry = resolve != RESOLVE_REMOTE ? gethostbyname(realhost) : NULL;
+            struct hostent* entry = resolve != RESOLVE_REMOTE ? gethostbyname(realhostU8) : NULL;
             if (entry != NULL && entry->h_addrtype == AF_INET && entry->h_length == sizeof (in_addr)) {
                 addr.s_addr = INADDR_LOOPBACK;
                 memcpy(ptr, entry->h_addr_list[0], entry->h_length);
@@ -1687,7 +1741,8 @@
         }
         /* username */
         if (proxy.user != NULL) {
-            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy.user);
+            u8 proxy_user = (const TCHAR *)proxy.user;
+            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy_user);
             ptr += proxy.user.length() + 1;
         }else{
             *ptr++ = '\0';
@@ -1694,8 +1749,8 @@
         }
         if (addr.s_addr == INADDR_NONE) {
             /* destination host name (for protocol 4a) */
-            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), realhost);
-            ptr += strlen(realhost) + 1;
+            strcpy_s((char*) ptr, sizeof buf - (ptr - buf), realhostU8);
+            ptr += strlen(realhostU8) + 1;
         }
         /* send command and get response
            response is: VN:1, CD:1, PORT:2, ADDR:4 */
@@ -1705,22 +1760,22 @@
         if (recieveFromSocket(s, buf, 8) == SOCKET_ERROR) {
             return SOCKET_ERROR;
         }
-        char uimsg[MAX_UIMSG];
-        uimsg[0] = NULL;
+        TCHAR uimsg[MAX_UIMSG];
+        uimsg[0] = 0;
         if (buf[0] != 0) {
-            UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                              "Proxy prevent this connection!");
+            UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, _countof(uimsg),
+                              _T("Proxy prevent this connection!"));
         }else if (buf[1] == SOCKS4_REP_IDENT_FAIL || buf[1] == SOCKS4_REP_USERID) {
-            UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, sizeof(uimsg),
-                              "Proxy authorization failed!");
+            UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, _countof(uimsg),
+                              _T("Proxy authorization failed!"));
         }else if (buf[1] != SOCKS4_REP_SUCCEEDED) {
-            UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                              "Proxy prevent this connection!");
+            UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, _countof(uimsg),
+                              _T("Proxy prevent this connection!"));
         }
-        if (uimsg[0] != NULL) {
+        if (uimsg[0] != 0) {
             return setError(s, uimsg);
         }
-    
+
         /* Conguraturation, connected via SOCKS4 server! */
         return 0;
     }
@@ -1727,20 +1782,23 @@
 
     int begin_relay_telnet(ProxyInfo& proxy, String realhost, unsigned short realport, SOCKET s) {
         int err = 0;
-        char uimsg[MAX_UIMSG];
+        TCHAR uimsg[MAX_UIMSG];
+        u8 realhostU8 = (const TCHAR *)realhost;
+        u8 proxy_user = (const TCHAR *)proxy.user;
+        u8 proxy_pass = (const TCHAR *)proxy.pass;
 
         while (!err) {
             switch (wait_for_prompt(s, prompt_table, countof(prompt_table), 10)) {
             case 0: /* Hostname prompt */
-                if (sendToSocketFormat(s, strchr(realhost,':')?"[%s]:%d\n":"%s:%d\n", (const char *)realhost, realport) == SOCKET_ERROR)
+                if (sendToSocketFormat(s, strchr(realhostU8,':')?"[%s]:%d\n":"%s:%d\n", (const char *)realhostU8, realport) == SOCKET_ERROR)
                     return SOCKET_ERROR;
                 break;
             case 1: /* Username prompt */
-                if (sendToSocketFormat(s, "%s\n", (const char *)proxy.user) == SOCKET_ERROR)
+                if (sendToSocketFormat(s, "%s\n", (const char *)proxy_user) == SOCKET_ERROR)
                     return SOCKET_ERROR;
                 break;
             case 2: /* Password prompt */
-                if (sendToSocketFormat(s, "%s\n", (const char *)proxy.pass) == SOCKET_ERROR)
+                if (sendToSocketFormat(s, "%s\n", (const char *)proxy_pass) == SOCKET_ERROR)
                     return SOCKET_ERROR;
                 break;
             case 3: /* Established message */
@@ -1752,11 +1810,11 @@
             }
         }
         UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg),
-                          "Proxy prevent this connection!");
+                          _T("Proxy prevent this connection!"));
         return setError(s, uimsg);
     }
 
-    int setError(SOCKET s, char *p) {
+    int setError(SOCKET s, TCHAR *p) {
         if (*p != NULL)
             showMessage(p);
         HWND window;
@@ -1771,7 +1829,7 @@
         WSASetLastError(WSAECONNREFUSED);
         return SOCKET_ERROR;
     }
-    void showMessage(char *p) {
+    void showMessage(TCHAR *p) {
         if (shower != NULL) {
             shower->showMessage(p);
         }
@@ -1814,7 +1872,7 @@
             struct sockaddr_in* in = (struct sockaddr_in*) name;
             info = connectioninfolist.get(in->sin_addr);
             if (info == NULL && defaultProxy.type != ProxyInfo::TYPE_NONE) {
-                info = new ConnectionInfo(defaultProxy, inet_ntoa(in->sin_addr));
+                info = new ConnectionInfo(defaultProxy, String((tc)inet_ntoa(in->sin_addr)));
                 holder = info;
             }
         }
@@ -1824,8 +1882,8 @@
             if (info == NULL && defaultProxy.type != ProxyInfo::TYPE_NONE) {
                 DWORD bufflen = 64;
                 char* buff = new char[64];
-                WSAAddressToString((struct sockaddr*)name, sizeof(struct sockaddr_in6), NULL, buff, &bufflen);
-                info = new ConnectionInfo(defaultProxy, buff);
+                WSAAddressToStringA((struct sockaddr*)name, sizeof(struct sockaddr_in6), NULL, buff, &bufflen);
+                info = new ConnectionInfo(defaultProxy, String((tc)buff));
                 holder = info;
             }
         }
@@ -1833,7 +1891,7 @@
             if (info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) {
                 info = NULL;
             }else{
-                const char* hostname;
+                u8 hostname;
                 if (info->proxy.type == ProxyInfo::TYPE_SSL) {
                     hostname = info->realhost;
                 }else{
@@ -1918,147 +1976,147 @@
                     return SOCKET_ERROR;
                 }
                 SSLSocket* ssl = new SSLSocket();
-                if (!ssl->connect(s, info->realhost)) {
+                if (!ssl->connect(s, (u8)info->realhost)) {
                     shutdown(s, SD_BOTH);
                     int error_code = ssl->get_verify_result();
-                    char uimsg[MAX_UIMSG];
+                    TCHAR uimsg[MAX_UIMSG];
                     delete ssl;
                     switch (error_code) {
                         case IDS_UNABLE_TO_GET_ISSUER_CERT:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_GET_ISSUER_CERT", uimsg, sizeof(uimsg),
-                                              "Unable to get Issuer Certificate");
+                                              _T("Unable to get Issuer Certificate"));
                             break;
                         case IDS_UNABLE_TO_GET_CRL:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_GET_CRL", uimsg, sizeof(uimsg),
-                                              "Unable to get Certificate CRL");
+                                              _T("Unable to get Certificate CRL"));
                             break;
                         case IDS_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_DECRYPT_CERT_SIGNATURE", uimsg, sizeof(uimsg),
-                                              "Unable to decrypt Certificate's Signature");
+                                              _T("Unable to decrypt Certificate's Signature"));
                             break;
                         case IDS_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_DECRYPT_CRL_SIGNATURE", uimsg, sizeof(uimsg),
-                                              "Unable to decrypt CRL's Signature");
+                                              _T("Unable to decrypt CRL's Signature"));
                             break;
                         case IDS_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY", uimsg, sizeof(uimsg),
-                                              "Unable to decode Issuer Public Key");
+                                              _T("Unable to decode Issuer Public Key"));
                             break;
                         case IDS_CERT_SIGNATURE_FAILURE:
                             UTIL_get_lang_msg("MSG_CERT_SIGNATURE_FAILURE", uimsg, sizeof(uimsg),
-                                              "Certificate Signature failure");
+                                              _T("Certificate Signature failure"));
                             break;
                         case IDS_CRL_SIGNATURE_FAILURE:
                             UTIL_get_lang_msg("MSG_CRL_SIGNATURE_FAILURE", uimsg, sizeof(uimsg),
-                                              "CRL Signature failure");
+                                              _T("CRL Signature failure"));
                             break;
                         case IDS_CERT_NOT_YET_VALID:
                             UTIL_get_lang_msg("MSG_CERT_NOT_YET_VALID", uimsg, sizeof(uimsg),
-                                              "Certificate is not yet valid");
+                                              _T("Certificate is not yet valid"));
                             break;
                         case IDS_CERT_HAS_EXPIRED:
                             UTIL_get_lang_msg("MSG_CERT_HAS_EXPIRED", uimsg, sizeof(uimsg),
-                                              "Certificate has expired");
+                                              _T("Certificate has expired"));
                             break;
                         case IDS_CRL_NOT_YET_VALID:
                             UTIL_get_lang_msg("MSG_CRL_NOT_YET_VALID", uimsg, sizeof(uimsg),
-                                              "CRL is not yet valid");
+                                              _T("CRL is not yet valid"));
                             break;
                         case IDS_CRL_HAS_EXPIRED:
                             UTIL_get_lang_msg("MSG_CRL_HAS_EXPIRED", uimsg, sizeof(uimsg),
-                                              "CRL has expired");
+                                              _T("CRL has expired"));
                             break;
                         case IDS_ERROR_IN_CERT_NOT_BEFORE_FIELD:
                             UTIL_get_lang_msg("MSG_ERROR_IN_CERT_NOT_BEFORE_FIELD", uimsg, sizeof(uimsg),
-                                              "Format error in Certificate's notBefore field");
+                                              _T("Format error in Certificate's notBefore field"));
                             break;
                         case IDS_ERROR_IN_CERT_NOT_AFTER_FIELD:
                             UTIL_get_lang_msg("MSG_ERROR_IN_CERT_NOT_AFTER_FIELD", uimsg, sizeof(uimsg),
-                                              "Format error in Certificate's notAfter field");
+                                              _T("Format error in Certificate's notAfter field"));
                             break;
                         case IDS_ERROR_IN_CRL_LAST_UPDATE_FIELD:
                             UTIL_get_lang_msg("MSG_ERROR_IN_CRL_LAST_UPDATE_FIELD", uimsg, sizeof(uimsg),
-                                              "Format error in CRL's lastUpdate field");
+                                              _T("Format error in CRL's lastUpdate field"));
                             break;
                         case IDS_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
                             UTIL_get_lang_msg("MSG_ERROR_IN_CRL_NEXT_UPDATE_FIELD", uimsg, sizeof(uimsg),
-                                              "Format error in CRL's nextUpdate field");
+                                              _T("Format error in CRL's nextUpdate field"));
                             break;
                         case IDS_OUT_OF_MEM:
                             UTIL_get_lang_msg("MSG_OUT_OF_MEM", uimsg, sizeof(uimsg),
-                                              "Out of memory");
+                                              _T("Out of memory"));
                             break;
                         case IDS_DEPTH_ZERO_SELF_SIGNED_CERT:
                             UTIL_get_lang_msg("MSG_DEPTH_ZERO_SELF_SIGNED_CERT", uimsg, sizeof(uimsg),
-                                              "Self-signed Certificate");
+                                              _T("Self-signed Certificate"));
                             break;
                         case IDS_SELF_SIGNED_CERT_IN_CHAIN:
                             UTIL_get_lang_msg("MSG_SELF_SIGNED_CERT_IN_CHAIN", uimsg, sizeof(uimsg),
-                                              "Self-signed Certificate found in Certificate chain");
+                                              _T("Self-signed Certificate found in Certificate chain"));
                             break;
                         case IDS_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_GET_ISSUER_CERT_LOCALLY", uimsg, sizeof(uimsg),
-                                              "Unable to get Local Issuer Certificate");
+                                              _T("Unable to get Local Issuer Certificate"));
                             break;
                         case IDS_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_VERIFY_LEAF_SIGNATURE", uimsg, sizeof(uimsg),
-                                              "Unable to verify the first Certificate");
+                                              _T("Unable to verify the first Certificate"));
                             break;
                         case IDS_CERT_CHAIN_TOO_LONG:
                             UTIL_get_lang_msg("MSG_CERT_CHAIN_TOO_LONG", uimsg, sizeof(uimsg),
-                                              "Certificate chain too long");
+                                              _T("Certificate chain too long"));
                             break;
                         case IDS_CERT_REVOKED:
                             UTIL_get_lang_msg("MSG_CERT_REVOKED", uimsg, sizeof(uimsg),
-                                              "Certificate revoked");
+                                              _T("Certificate revoked"));
                             break;
                         case IDS_INVALID_CA:
                             UTIL_get_lang_msg("MSG_INVALID_CA", uimsg, sizeof(uimsg),
-                                              "Invalid CA Certificate");
+                                              _T("Invalid CA Certificate"));
                             break;
                         case IDS_PATH_LENGTH_EXCEEDED:
                             UTIL_get_lang_msg("MSG_PATH_LENGTH_EXCEEDED", uimsg, sizeof(uimsg),
-                                              "Path length constraint exceeded");
+                                              _T("Path length constraint exceeded"));
                             break;
                         case IDS_INVALID_PURPOSE:
                             UTIL_get_lang_msg("MSG_INVALID_PURPOSE", uimsg, sizeof(uimsg),
-                                              "Unsupported Certificate purpose");
+                                              _T("Unsupported Certificate purpose"));
                             break;
                         case IDS_CERT_UNTRUSTED:
                             UTIL_get_lang_msg("MSG_CERT_UNTRUSTED", uimsg, sizeof(uimsg),
-                                              "Certificate not trusted");
+                                              _T("Certificate not trusted"));
                             break;
                         case IDS_CERT_REJECTED:
                             UTIL_get_lang_msg("MSG_CERT_REJECTED", uimsg, sizeof(uimsg),
-                                              "Certificate rejected");
+                                              _T("Certificate rejected"));
                             break;
                         case IDS_SUBJECT_ISSUER_MISMATCH:
                             UTIL_get_lang_msg("MSG_SUBJECT_ISSUER_MISMATCH", uimsg, sizeof(uimsg),
-                                              "Subject Issuer mismatch");
+                                              _T("Subject Issuer mismatch"));
                             break;
                         case IDS_AKID_SKID_MISMATCH:
                             UTIL_get_lang_msg("MSG_AKID_SKID_MISMATCH", uimsg, sizeof(uimsg),
-                                              "Authority and Subject Key Identifier mismatch");
+                                              _T("Authority and Subject Key Identifier mismatch"));
                             break;
                         case IDS_AKID_ISSUER_SERIAL_MISMATCH:
                             UTIL_get_lang_msg("MSG_AKID_ISSUER_SERIAL_MISMATCH", uimsg, sizeof(uimsg),
-                                              "Authority and Issuer Serial Number mismatch");
+                                              _T("Authority and Issuer Serial Number mismatch"));
                             break;
                         case IDS_KEYUSAGE_NO_CERTSIGN:
                             UTIL_get_lang_msg("MSG_KEYUSAGE_NO_CERTSIGN", uimsg, sizeof(uimsg),
-                                              "Key usage does not include Certificate signing");
+                                              _T("Key usage does not include Certificate signing"));
                             break;
                         case IDS_APPLICATION_VERIFICATION:
                             UTIL_get_lang_msg("MSG_APPLICATION_VERIFICATION", uimsg, sizeof(uimsg),
-                                              "Application verification failure");
+                                              _T("Application verification failure"));
                             break;
                         case IDS_UNMATCH_COMMON_NAME:
                             UTIL_get_lang_msg("MSG_UNMATCH_COMMON_NAME", uimsg, sizeof(uimsg),
-                                              "Unmatch Common Name");
+                                              _T("Unmatch Common Name"));
                             break;
                         case IDS_UNABLE_TO_GET_COMMON_NAME:
                             UTIL_get_lang_msg("MSG_UNABLE_TO_GET_COMMON_NAME", uimsg, sizeof(uimsg),
-                                              "Unable to get Common Name");
+                                              _T("Unable to get Common Name"));
                             break;
                         default:
                             uimsg[0] = NULL;
@@ -2073,10 +2131,10 @@
     }
 
     DECLARE_HOOKAPI(struct hostent*, gethostbyname, (const char* hostname), (hostname)) {
-        ConnectionInfo* info = connectioninfolist.find(hostname);
+        ConnectionInfo* info = connectioninfolist.find((tc)hostname);
         if (info != NULL) {
             if (info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) {
-                hostname = info->realhost;
+                hostname = (u8)info->realhost;
             }else{
                 if (info->proxy.type == ProxyInfo::TYPE_SSL
                     || info->proxy.type == ProxyInfo::TYPE_HTTP_SSL
@@ -2089,7 +2147,8 @@
                     }
                 }
                 if (info->buffer == NULL) {
-                    int bufferLength = sizeof (DUMMYHOSTENT) + strlen(info->realhost);
+                    u8 realhostU8 = (const TCHAR *)info->realhost;
+                    int bufferLength = sizeof (DUMMYHOSTENT) + strlen(realhostU8);
                     info->buffer = new char[bufferLength];
                     info->fillBuffer(info->buffer, bufferLength);
                 }
@@ -2100,7 +2159,7 @@
     }
 
     DECLARE_HOOKAPI(HANDLE, WSAAsyncGetHostByName, (HWND window, UINT message, const char* hostname, char* buffer, int bufferLength), (window, message, hostname, buffer, bufferLength)) {
-        ConnectionInfo* info = connectioninfolist.find(hostname);
+        ConnectionInfo* info = connectioninfolist.find((tc)hostname);
         if (info == NULL || info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) {
             return ORIG_WSAAsyncGetHostByName(window, message, hostname, buffer, bufferLength);
         }
@@ -2115,7 +2174,8 @@
             }
         }
         HANDLE handle = connectioninfolist.getTask(info);
-        int len = sizeof (DUMMYHOSTENT) + strlen(hostname);
+        u8 hostnameU8 = hostname;
+        int len = sizeof (DUMMYHOSTENT) + strlen(hostnameU8);
         if (bufferLength < len) {
             ::PostMessage(window, message, (WPARAM) handle, MAKELPARAM(len, WSAENOBUFS));
             ::WSASetLastError(WSAENOBUFS);
@@ -2127,7 +2187,7 @@
     }
 
     DECLARE_HOOKAPI(HANDLE, WSAAsyncGetAddrInfo, (HWND window, UINT message, const char* hostname, const char* portname, struct addrinfo* hints, struct addrinfo** res), (window, message, hostname, portname, hints, res)) {
-        ConnectionInfo* info = connectioninfolist.find(hostname);
+        ConnectionInfo* info = connectioninfolist.find((tc)hostname);
         if (info == NULL || info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) {
             return ORIG_WSAAsyncGetAddrInfo(window, message, hostname, portname, hints, res);
         }
@@ -2142,7 +2202,8 @@
             }
         }
         HANDLE handle = connectioninfolist.getTask(info);
-        int bufferLength = sizeof (DUMMYHOSTENT) + strlen(hostname) + 1;
+        u8 hostnameU8 = hostname;
+        int bufferLength = sizeof (DUMMYHOSTENT) + strlen(hostnameU8) + 1;
         info->buffer = new char[bufferLength];
         info->fillBuffer(info->buffer, bufferLength, portname, hints->ai_family);
         DUMMYHOSTENT* d = (DUMMYHOSTENT*)info->buffer;
@@ -2225,7 +2286,7 @@
     int aicount;
 
     ProxyWSockHook():shower(NULL), owner(NULL), resource_module(GetInstanceHandle()), timeout(0), aicount(0) {
-        HMODULE ws2_32 = ::GetModuleHandle("ws2_32.dll");
+        HMODULE ws2_32 = ::GetModuleHandle(_T("ws2_32.dll"));
         LOADAPI(connect)
         LOADAPI(gethostbyname)
         LOADAPI(WSAAsyncGetHostByName)
@@ -2245,54 +2306,54 @@
     }
     void _load(IniFile& ini) {
         String temp;
-        temp = ini.getString("ProxyType");
+        temp = ini.getString(_T("ProxyType"));
         if (temp != NULL) {
             defaultProxy.type = ProxyInfo::parseType(temp);
             if (defaultProxy.type != ProxyInfo::TYPE_NONE) {
-                defaultProxy.host = ini.getString("ProxyHost");
+                defaultProxy.host = ini.getString(_T("ProxyHost"));
                 if (defaultProxy.host == NULL || defaultProxy.type == ProxyInfo::TYPE_NONE_FORCE) {
                     defaultProxy.type = ProxyInfo::TYPE_NONE;
                 }else{
-                    defaultProxy.port = (unsigned short) ini.getInteger("ProxyPort");
-                    defaultProxy.user = ini.getString("ProxyUser");
+                    defaultProxy.port = (unsigned short) ini.getInteger(_T("ProxyPort"));
+                    defaultProxy.user = ini.getString(_T("ProxyUser"));
                     if (defaultProxy.user != NULL)
-                        defaultProxy.pass = ini.getString("ProxyPass");
+                        defaultProxy.pass = ini.getString(_T("ProxyPass"));
                 }
             }
         }
 
-        timeout = ini.getInteger("ConnectionTimeout", 10);
+        timeout = ini.getInteger(_T("ConnectionTimeout"), 10);
 
-        temp = ini.getString("SocksResolve");
-        if (temp.equalsIgnoreCase("remote")) {
+        temp = ini.getString(_T("SocksResolve"));
+        if (temp.equalsIgnoreCase(_T("remote"))) {
             resolve = RESOLVE_REMOTE;
-        }else if (temp.equalsIgnoreCase("local")) {
+        }else if (temp.equalsIgnoreCase(_T("local"))) {
             resolve = RESOLVE_LOCAL;
         }else{
             resolve = RESOLVE_AUTO;
         }
 
-        prompt_table[0] = ini.getString("TelnetHostnamePrompt", ">> Host name: ");
-        prompt_table[1] = ini.getString("TelnetUsernamePrompt", "Username:");
-        prompt_table[2] = ini.getString("TelnetPasswordPrompt", "Password:");
-        prompt_table[3] = ini.getString("TelnetConnectedMessage", "-- Connected to ");
-        prompt_table[4] = ini.getString("TelnetErrorMessage", "!!!!!!!!");
+        prompt_table[0] = ini.getString(_T("TelnetHostnamePrompt"), _T(">> Host name: "));
+        prompt_table[1] = ini.getString(_T("TelnetUsernamePrompt"), _T("Username:"));
+        prompt_table[2] = ini.getString(_T("TelnetPasswordPrompt"), _T("Password:"));
+        prompt_table[3] = ini.getString(_T("TelnetConnectedMessage"), _T("-- Connected to "));
+        prompt_table[4] = ini.getString(_T("TelnetErrorMessage"), _T("!!!!!!!!"));
 
-        logfile = ini.getString("DebugLog");
+        logfile = ini.getString(_T("DebugLog"));
         Logger::open(logfile);
     }
     void _save(IniFile& ini) {
-        const char* type = NULL;
-        const char* host = NULL;
-        const char* port = NULL;
-        const char* user = NULL;
-        const char* pass = NULL;
+        const TCHAR* type = NULL;
+        const TCHAR* host = NULL;
+        const TCHAR* port = NULL;
+        const TCHAR* user = NULL;
+        const TCHAR* pass = NULL;
         if (defaultProxy.type != ProxyInfo::TYPE_NONE && defaultProxy.type != ProxyInfo::TYPE_NONE_FORCE && defaultProxy.host != NULL) {
             type = ProxyInfo::getTypeName(defaultProxy.type);
             host = defaultProxy.host;
             if (defaultProxy.port != 0) {
-                char* buffer = (char*) alloca(6);
-                _itoa_s(defaultProxy.port, buffer, 6, 10);
+                TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * 6);
+                _itot_s(defaultProxy.port, buffer, 6, 10);
                 port = buffer;
             }
             if (defaultProxy.user != NULL) {
@@ -2302,34 +2363,34 @@
                 }
             }
         }
-        ini.setString("ProxyType",  type);
-        ini.setString("ProxyHost",  host);
-        ini.setString("ProxyPort",  port);
-        ini.setString("ProxyUser",  user);
-        ini.setString("ProxyPass",  pass);
+        ini.setString(_T("ProxyType"),  type);
+        ini.setString(_T("ProxyHost"),  host);
+        ini.setString(_T("ProxyPort"),  port);
+        ini.setString(_T("ProxyUser"),  user);
+        ini.setString(_T("ProxyPass"),  pass);
 
-        ini.setInteger("ConnectionTimeout", timeout);
+        ini.setInteger(_T("ConnectionTimeout"), timeout);
 
         switch (resolve) {
         case RESOLVE_REMOTE:
-            type = "remote";
+            type = _T("remote");
             break;
         case RESOLVE_LOCAL:
-            type = "local";
+            type = _T("local");
             break;
         default:
-            type = "auto";
+            type = _T("auto");
             break;
         }
-        ini.setString("SocksResolve", type);
+        ini.setString(_T("SocksResolve"), type);
 
-        ini.setString("TelnetHostnamePrompt",   prompt_table[0]);
-        ini.setString("TelnetUsernamePrompt",   prompt_table[1]);
-        ini.setString("TelnetPasswordPrompt",   prompt_table[2]);
-        ini.setString("TelnetConnectedMessage", prompt_table[3]);
-        ini.setString("TelnetErrorMessage",     prompt_table[4]);
+        ini.setString(_T("TelnetHostnamePrompt"),   prompt_table[0]);
+        ini.setString(_T("TelnetUsernamePrompt"),   prompt_table[1]);
+        ini.setString(_T("TelnetPasswordPrompt"),   prompt_table[2]);
+        ini.setString(_T("TelnetConnectedMessage"), prompt_table[3]);
+        ini.setString(_T("TelnetErrorMessage"),     prompt_table[4]);
 
-        ini.setString("DebugLog", logfile);
+        ini.setString(_T("DebugLog"), logfile);
     }
 public:
     static void setOwner(HWND owner) {
@@ -2408,11 +2469,11 @@
     static String generateURL() {
         return instance().defaultProxy.generateURL();
     }
-        static String parseURL(const char* url, BOOL prefix) {
+    static String parseURL(const char* url, BOOL prefix) {
         ProxyInfo proxy;
-        String realhost = ProxyInfo::parse(url, proxy);
+        String realhost = ProxyInfo::parse((tc)url, proxy);
         if (realhost != NULL) {
-            if (realhost.indexOf("://") != -1 && !prefix) {
+            if (realhost.indexOf(_T("://")) != -1 && !prefix) {
                 proxy.type = proxy.TYPE_NONE;
             }
             if (realhost.length() == 0) {

Modified: branches/cmake/TTProxy/SSLLIB.h
===================================================================
--- branches/cmake/TTProxy/SSLLIB.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/SSLLIB.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -11,7 +11,7 @@
 rettype apiname arglist {                                     \
     static rettype (*func) arglist =                          \
        (rettype (*) arglist)                                  \
-       GetProcAddress(GetModuleHandle(#module), #apiname);    \
+       GetProcAddress(GetModuleHandleA(#module), #apiname);    \
     return (*func) args;                                      \
 }
 #define DECLARE_MODULE_API_v(module, apiname, arglist, args) \
@@ -18,7 +18,7 @@
     void apiname arglist {                                   \
     static void (*func) arglist =                            \
        (void (*) arglist)                                    \
-       GetProcAddress(GetModuleHandle(#module), #apiname);   \
+       GetProcAddress(GetModuleHandleA(#module), #apiname);   \
     (*func) args;                                            \
 }
 

Modified: branches/cmake/TTProxy/SSLSocket.h
===================================================================
--- branches/cmake/TTProxy/SSLSocket.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/SSLSocket.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -84,8 +84,8 @@
     }
 public:
     static bool init() {
-        LIBEAY32() = ::LoadLibrary("LIBEAY32");
-        SSLEAY32() = ::LoadLibrary("SSLEAY32");
+        LIBEAY32() = ::LoadLibraryA("LIBEAY32");
+        SSLEAY32() = ::LoadLibraryA("SSLEAY32");
         if (LIBEAY32() == NULL || SSLEAY32() == NULL) {
             if (LIBEAY32() != NULL) {
                 ::FreeLibrary(LIBEAY32());
@@ -140,12 +140,15 @@
                 if (*s2 != '.')
                     return false;
             }else{
+#if !defined(UNICODE)
                 if (::IsDBCSLeadByte(*s1)) {
                     if (*s1 != *s2 || s1 + 1 >= s1_end || s2 + 1 >= s2_end || *(s1 + 1) != *(s2 + 1))
                         return false;
                     s1++;
                     s2++;
-                }else{
+                } else
+#endif
+                {
                     if (toLowerCase(*s1) != toLowerCase(*s2))
                         return false;
                 }
@@ -156,13 +159,15 @@
         return true;
     }
 
+#if 0
     static int print_debugw32(const char *str, size_t len, void *u) {
         char* buf = (char*) alloca(len + 1);
         memcpy(buf, str, len);
         buf[len] = '\0';
-        OutputDebugString(buf);
+        OutputDebugStringA(buf);
         return len;
     }
+#endif
 private:
     SSL* ssl;
     long verify_result;

Modified: branches/cmake/TTProxy/TTProxy.cpp
===================================================================
--- branches/cmake/TTProxy/TTProxy.cpp	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/TTProxy.cpp	2018-12-14 15:41:26 UTC (rev 7327)
@@ -1,7 +1,7 @@
 // ttx.cpp : DLL \x83A\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x97p\x82̃G\x83\x93\x83g\x83\x8A \x83|\x83C\x83\x93\x83g\x82\xF0\x92\xE8\x8B`\x82\xB5\x82܂\xB7\x81B
 //
 
-#include "stdafx.h"
+#include "StdAfx.h"
 
 #include "resource.h"
 
@@ -18,6 +18,7 @@
 }
 
 extern "C" __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
+	(void)reserved;
 	switch (reason) {
 	case DLL_PROCESS_ATTACH:
 		myInstance = instance;

Modified: branches/cmake/TTProxy/TTProxy.h
===================================================================
--- branches/cmake/TTProxy/TTProxy.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/TTProxy.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -1,6 +1,8 @@
 #ifndef _YEBISOCKS_TTX_H_
 #define _YEBISOCKS_TTX_H_
 
+#include "codeconv.h"
+
 #include <YCL/DynamicLinkLibrary.h>
 using namespace yebisuya;
 
@@ -31,7 +33,7 @@
 private:
 	class Shower : public ProxyWSockHook::MessageShower {
 	public:
-		virtual void showMessage(const char* message)const {
+		virtual void showMessage(const TCHAR* message)const {
 			add_error_message(message);
 		}
 	} shower;
@@ -46,10 +48,10 @@
 	PWriteIniFile ORIG_WriteIniFile;
 	PParseParam ORIG_ParseParam;
 
-	static void add_error_message(const char* message) {
+	static void add_error_message(const TCHAR* message) {
 		if (getInstance().error_message != NULL) {
-			StringBuffer buffer = (const char *)getInstance().error_message;
-			buffer.append("\n\n");
+			StringBuffer buffer = (const TCHAR *)getInstance().error_message;
+			buffer.append(_T("\n\n"));
 			buffer.append(message);
 			getInstance().error_message = buffer.toString();
 		}else{
@@ -58,22 +60,22 @@
 		::PostMessage(getInstance().cv->HWin, WM_COMMAND, ID_ASYNCMESSAGEBOX, 0);
 	}
 	static void read_options(const char* filename) {
-		IniFile inifile(filename, "TTProxy");
+		IniFile inifile(String((tc)filename), _T("TTProxy"));
 		ProxyWSockHook::load(inifile);
 		getInstance().initialized = true;
 	}
 	static void write_options(const char* filename) {
-		IniFile inifile(filename, "TTProxy");
+		IniFile inifile(String((tc)filename), _T("TTProxy"));
 		ProxyWSockHook::save(inifile);
 	}
-	static String get_teraterm_dir_relative_name(char* basename) {
+	static String get_teraterm_dir_relative_name(TCHAR* basename) {
 		if (basename[0] == '\\' || basename[0] == '/' || basename[0] != '\0' && basename[1] == ':') {
 			return basename;
 		}
-		char buf[1024];
+		TCHAR buf[1024];
 		::GetModuleFileName(NULL, buf, sizeof buf);
-		char* filename = NULL;
-		for (char* dst = buf; *dst != '\0'; dst++) {
+		TCHAR* filename = NULL;
+		for (TCHAR* dst = buf; *dst != '\0'; dst++) {
 			if (*dst == '\\' || *dst == '/' || *dst == ':') {
 				filename = dst + 1;
 			}
@@ -87,16 +89,16 @@
 		return buffer.toString();
 	}
 
-	static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts) {
+	static void WINAPI TTXReadINIFile(char *fileName, PTTSet ts) {
 		getInstance().ORIG_ReadIniFile(fileName, ts);
 		read_options(fileName);
 	}
-	static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts) {
+	static void WINAPI TTXWriteINIFile(char *fileName, PTTSet ts) {
 		getInstance().ORIG_WriteIniFile(fileName, ts);
 		write_options(fileName);
 	}
 
-	static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
+	static void WINAPI TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
 		//int param_len=strlen(param);
 		char option[1024];
 		int opt_len = sizeof(option);
@@ -115,7 +117,7 @@
 
 			if ((option[0] == '-' || option[0] == '/')) {
 				if ((option[1] == 'F' || option[1] == 'f') && option[2] == '=') {
-					read_options(get_teraterm_dir_relative_name(option + 3));
+					read_options((u8)get_teraterm_dir_relative_name((TCHAR *)(const TCHAR *)(tc)(option + 3)));
 				}
 			}
 
@@ -156,7 +158,7 @@
 				String realhost = ProxyWSockHook::parseURL(option, FALSE);
 				if (realhost != NULL) {
 					getInstance().realhost = realhost;
-					if (realhost.indexOf("://") == -1) {
+					if (realhost.indexOf(_T("://")) == -1) {
 						action = OPTION_CLEAR;
 					}
 					else {
@@ -182,7 +184,7 @@
 
 		getInstance().ORIG_ParseParam(param, ts, DDETopic);
 		if (getInstance().ts->HostName[0] == '\0' && getInstance().realhost != NULL) {
-			strcpy_s(getInstance().ts->HostName, sizeof getInstance().ts->HostName, getInstance().realhost);
+			strcpy_s(getInstance().ts->HostName, sizeof getInstance().ts->HostName, (u8)getInstance().realhost);
 		}
 	}
 
@@ -195,7 +197,7 @@
 		*((WORD*) lParam) = langid;
 		return FALSE;
 	}
-	static void PASCAL TTXInit(PTTSet ts, PComVar cv) {
+	static void WINAPI TTXInit(PTTSet ts, PComVar cv) {
 		getInstance().ts = ts;
 		getInstance().cv = cv;
 
@@ -202,7 +204,7 @@
 		ProxyWSockHook::setMessageShower(&getInstance().shower);
 	}
 
-	static void PASCAL TTXGetSetupHooks(TTXSetupHooks* hooks) {
+	static void WINAPI TTXGetSetupHooks(TTXSetupHooks* hooks) {
 		getInstance().ORIG_ReadIniFile = *hooks->ReadIniFile;
 		getInstance().ORIG_WriteIniFile = *hooks->WriteIniFile;
 		getInstance().ORIG_ParseParam = *hooks->ParseParam;
@@ -212,7 +214,7 @@
 		copy_UILanguageFile();
 	}
 
-	static void PASCAL TTXOpenTCP(TTXSockHooks* hooks) {
+	static void WINAPI TTXOpenTCP(TTXSockHooks* hooks) {
 		if (!getInstance().initialized) {
 			read_options(getInstance().ts->SetupFName);
 		}
@@ -224,7 +226,7 @@
 		(FARPROC&) *hooks->PWSACancelAsyncRequest = ProxyWSockHook::hook_WSACancelAsyncRequest((FARPROC) *hooks->PWSACancelAsyncRequest);
 	}
 
-	static void PASCAL TTXCloseTCP(TTXSockHooks* hooks) {
+	static void WINAPI TTXCloseTCP(TTXSockHooks* hooks) {
 		// unhook functions
 		ProxyWSockHook::unhook_connect((FARPROC) *hooks->Pconnect);
 		ProxyWSockHook::unhook_WSAAsyncGetHostByName((FARPROC) *hooks->PWSAAsyncGetHostByName);
@@ -234,18 +236,18 @@
 		ProxyWSockHook::unhook_WSACancelAsyncRequest((FARPROC) *hooks->PWSACancelAsyncRequest);
 	}
 
-	static void PASCAL TTXModifyMenu(HMENU menu) {
-		char uimsg[MAX_UIMSG];
+	static void WINAPI TTXModifyMenu(HMENU menu) {
+		TCHAR uimsg[MAX_UIMSG];
 		copy_UILanguageFile();
 		/* inserts before ID_HELP_ABOUT */
-		UTIL_get_lang_msg("MENU_ABOUT", uimsg, sizeof(uimsg), "About TT&Proxy...");
+		UTIL_get_lang_msg("MENU_ABOUT", uimsg, _countof(uimsg), _T("About TT&Proxy..."));
 		InsertMenu(menu, 50990, MF_BYCOMMAND | MF_ENABLED, ID_ABOUTMENU, uimsg);
 		/* inserts before ID_SETUP_TCPIP */
-		UTIL_get_lang_msg("MENU_SETUP", uimsg, sizeof(uimsg), "&Proxy...");
+		UTIL_get_lang_msg("MENU_SETUP", uimsg, _countof(uimsg), _T("&Proxy..."));
 		InsertMenu(menu, 50360, MF_BYCOMMAND | MF_ENABLED, ID_PROXYSETUPMENU, uimsg);
 	}
 
-	static int PASCAL TTXProcessCommand(HWND hWin, WORD cmd) {
+	static int WINAPI TTXProcessCommand(HWND hWin, WORD cmd) {
 		switch (cmd) {
 		case ID_ABOUTMENU:
 			copy_UILanguageFile();
@@ -260,7 +262,7 @@
 				String msg = getInstance().error_message;
 				getInstance().showing_error_message = true;
 				getInstance().error_message = NULL;
-				::MessageBox(hWin, msg, "TTProxy", MB_OK | MB_ICONERROR);
+				::MessageBox(hWin, msg, _T("TTProxy"), MB_OK | MB_ICONERROR);
 				getInstance().showing_error_message = false;
 				if (getInstance().error_message != NULL) {
 					::PostMessage(hWin, WM_COMMAND, ID_ASYNCMESSAGEBOX, 0);
@@ -272,19 +274,20 @@
 		}
 	}
 
-	static void PASCAL TTXSetCommandLine(PCHAR cmd, int cmdlen, PGetHNRec rec) {
+	static void WINAPI TTXSetCommandLine(PCHAR cmd, int cmdlen, PGetHNRec rec) {
 		String url = ProxyWSockHook::generateURL();
 		if (url != NULL) {
-			if (strlen(cmd) + 8 + url.length() >= (unsigned) cmdlen)
+			u8 urlU8 = (const TCHAR *)url;
+			if (strlen(cmd) + 8 + strlen(urlU8) >= (unsigned) cmdlen)
 				return;
 			strcat_s(cmd, cmdlen, " -proxy=");
-			strcat_s(cmd, cmdlen, url);
+			strcat_s(cmd, cmdlen, urlU8);
 		}
 	}
 
-	static void PASCAL TTXEnd() {
+	static void WINAPI TTXEnd() {
 		if (getInstance().error_message != NULL) {
-			::MessageBox(NULL, getInstance().error_message, "TTProxy", MB_OK | MB_ICONERROR);
+			::MessageBox(NULL, getInstance().error_message, _T("TTProxy"), MB_OK | MB_ICONERROR);
 			getInstance().error_message = NULL;
 		}
 	}

Modified: branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -30,7 +30,7 @@
 	int resetContent() {
 		return SendMessage(CB_RESETCONTENT);
 	}
-	int addString(const char* string) {
+	int addString(const TCHAR* string) {
 		return SendMessage(CB_ADDSTRING, 0, (LPARAM) string);
 	}
 	int addItemData(long data) {
@@ -48,12 +48,12 @@
 	int getTextLen(int index)const {
 		return SendMessage(CB_GETLBTEXTLEN, index);
 	}
-	int getText(int index, char* buffer)const {
+	int getText(int index, TCHAR* buffer)const {
 		return SendMessage(CB_GETLBTEXT, index, (LPARAM) buffer);
 	}
 	String getText(int index) {
 		int length = getTextLen(index);
-		char* buffer = (char*) alloca(length + 1);
+		TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * (length + 1));
 		getText(index, buffer);
 		return buffer;
 	}

Modified: branches/cmake/TTProxy/YCL/include/YCL/Dialog.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/Dialog.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/Dialog.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -14,6 +14,10 @@
 #include <YCL/Window.h>
 #include <YCL/Hashtable.h>
 
+#include "dlglib.h"
+
+#define	DIALOGBOX_REPLACE	1
+
 namespace yebisuya {
 
 class Dialog : virtual public Window {
@@ -65,10 +69,10 @@
 		int value = ::GetDlgItemInt(*this, id, &succeeded, valueSigned);
 		return succeeded ? value : defaultValue;
 	}
-	bool SetDlgItemText(int id, const char* text) {
+	bool SetDlgItemText(int id, const TCHAR* text) {
 		return ::SetDlgItemText(*this, id, text) != FALSE;
 	}
-	int GetDlgItemText(int id, char* buffer, size_t length)const {
+	int GetDlgItemText(int id, TCHAR* buffer, size_t length)const {
 		return ::GetDlgItemText(*this, id, buffer, length);
 	}
 	String GetDlgItemText(int id)const {
@@ -78,7 +82,11 @@
 		return ::SendDlgItemMessage(*this, id, message, wparam, lparam);
 	}
 	bool EndDialog(int result) {
+#if defined(DIALOGBOX_REPLACE)
+		return ::TTEndDialog(*this, result) != FALSE;
+#else
 		return ::EndDialog(*this, result) != FALSE;
+#endif
 	}
 	bool MapDialogRect(RECT& rect)const {
 		return ::MapDialogRect(*this, &rect) != FALSE;
@@ -109,7 +117,11 @@
 	}
 	int open(HINSTANCE instance, int resourceId, HWND owner = NULL) {
 		YCLVERIFY(prepareOpen(this) == NULL, "Another dialog has been opening yet.");
+#if defined(DIALOGBOX_REPLACE)
+		return ::TTDialogBoxParam(instance, MAKEINTRESOURCE(resourceId), owner, (DLGPROC)DialogProc, NULL);
+#else
 		return ::DialogBoxParam(instance, MAKEINTRESOURCE(resourceId), owner, (DLGPROC)DialogProc, NULL);
+#endif
 	}
 protected:
 	virtual bool dispatch(int message, int wparam, long lparam) {

Modified: branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -21,13 +21,13 @@
 	int getLineCount()const {
 		return SendMessage(EM_GETLINECOUNT);
 	}
-	int getLine(int line, char* buffer, int length)const {
+	int getLine(int line, TCHAR* buffer, int length)const {
 		*((int*) buffer) = length;
 		return SendMessage(EM_GETLINE, line, (LPARAM) buffer);
 	}
 	String getLine(int line)const {
 		int length = lineLength(line);
-		char* buffer = (char*) alloca(length + 1);
+		TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * (length + 1));
 		getLine(line, buffer, length + 1);
 		return buffer;
 	}

Modified: branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -19,84 +19,84 @@
 
 class FileVersion {
 private:
-        static const char* ROOT() {
-                static const char string[] = "\\";
-                return string;
-        }
-        static const char* TRANS() {
-                static const char string[] = "\\VarFileInfo\\Translation";
-                return string;
-        }
-        static const char* STRINGBLOCK() {
-                static const char string[] = "\\StringFileInfo\\%08X\\%s";
-                return string;
-        }
+	static const TCHAR* ROOT() {
+		static const TCHAR string[] = _T("\\");
+		return string;
+	}
+	static const TCHAR* TRANS() {
+		static const TCHAR string[] = _T("\\VarFileInfo\\Translation");
+		return string;
+	}
+	static const TCHAR* STRINGBLOCK() {
+		static const TCHAR string[] = _T("\\StringFileInfo\\%08X\\%s");
+		return string;
+	}
 
-	static const char* COMMENTS() {
-	        static const char string[] = "Comments";
-	        return string;
+	static const TCHAR* COMMENTS() {
+		static const TCHAR string[] = _T("Comments");
+		return string;
 	}
-	static const char* COMPANYNAME() {
-	        static const char string[] = "CompanyName";
-	        return string;
+	static const TCHAR* COMPANYNAME() {
+		static const TCHAR string[] = _T("CompanyName");
+		return string;
 	}
-	static const char* FILEDESCRIPTION() {
-	        static const char string[] = "FileDescription";
-	        return string;
+	static const TCHAR* FILEDESCRIPTION() {
+		static const TCHAR string[] = _T("FileDescription");
+		return string;
 	}
-	static const char* FILEVERSION() {
-	        static const char string[] = "FileVersion";
-	        return string;
+	static const TCHAR* FILEVERSION() {
+		static const TCHAR string[] = _T("FileVersion");
+		return string;
 	}
-	static const char* INTERNALNAME() {
-	        static const char string[] = "InternalName";
-	        return string;
+	static const TCHAR* INTERNALNAME() {
+		static const TCHAR string[] = _T("InternalName");
+		return string;
 	}
-	static const char* LEGALCOPYRIGHT() {
-	        static const char string[] = "LegalCopyright";
-	        return string;
+	static const TCHAR* LEGALCOPYRIGHT() {
+		static const TCHAR string[] = _T("LegalCopyright");
+		return string;
 	}
-	static const char* LEGALTRADEMARKS() {
-	        static const char string[] = "LegalTrademarks";
-	        return string;
+	static const TCHAR* LEGALTRADEMARKS() {
+		static const TCHAR string[] = _T("LegalTrademarks");
+		return string;
 	}
-	static const char* ORIGINALFILENAME() {
-	        static const char string[] = "OriginalFilename";
-	        return string;
+	static const TCHAR* ORIGINALFILENAME() {
+		static const TCHAR string[] = _T("OriginalFilename");
+		return string;
 	}
-	static const char* PRIVATEBUILD() {
-	        static const char string[] = "PrivateBuild";
-	        return string;
+	static const TCHAR* PRIVATEBUILD() {
+		static const TCHAR string[] = _T("PrivateBuild");
+		return string;
 	}
-	static const char* PRODUCTNAME() {
-	        static const char string[] = "ProductName";
-	        return string;
+	static const TCHAR* PRODUCTNAME() {
+		static const TCHAR string[] = _T("ProductName");
+		return string;
 	}
-	static const char* PRODUCTVERSION() {
-	        static const char string[] = "ProductVersion";
-	        return string;
+	static const TCHAR* PRODUCTVERSION() {
+		static const TCHAR string[] = _T("ProductVersion");
+		return string;
 	}
-	static const char* SPECIALBUILD() {
-	        static const char string[] = "SpecialBuild";
-	        return string;
+	static const TCHAR* SPECIALBUILD() {
+		static const TCHAR string[] = _T("SpecialBuild");
+		return string;
 	}
 
-	char* info;
+	TCHAR* info;
 	mutable LPWORD trans;
 	mutable UINT transSize;
 	mutable VS_FIXEDFILEINFO* fixedInfo;
 
 	void init(HINSTANCE instance) {
-		char buffer[MAX_PATH];
+		TCHAR buffer[MAX_PATH];
 		::GetModuleFileName(instance, buffer, countof(buffer));
 		init(buffer);
 	}
-	void init(const char* filename) {
+	void init(const TCHAR* filename) {
 		DWORD handle;
-		DWORD size = ::GetFileVersionInfoSize((char*) filename, &handle);
+		DWORD size = ::GetFileVersionInfoSize(filename, &handle);
 		if (size != 0){
-			info = new char[size];
-			if (!::GetFileVersionInfo((char*) filename, handle, size, info)) {
+			info = new TCHAR[size];
+			if (!::GetFileVersionInfo(filename, handle, size, info)) {
 				delete[] info;
 				info = NULL;
 			}
@@ -105,7 +105,7 @@
 	bool validateFixedFileInfo()const {
 		if (fixedInfo == NULL){
 			UINT size;
-			if (!::VerQueryValue((void*) (const void*) info, (char*) ROOT(), (LPVOID*) &fixedInfo, &size))
+			if (!::VerQueryValue((void*) (const void*) info, ROOT(), (LPVOID*) &fixedInfo, &size))
 				return false;
 		}
 		return true;
@@ -112,7 +112,7 @@
 	}
 	bool validateTranslation()const {
 		if (trans == NULL){
-			if (!::VerQueryValue((void*) (const void*) info, (char*) TRANS(), (LPVOID*) &trans, &transSize))
+			if (!::VerQueryValue((void*) (const void*) info, TRANS(), (LPVOID*) &trans, &transSize))
 				return false;
 		}
 		return true;
@@ -124,7 +124,7 @@
 	FileVersion(HINSTANCE hInstance):info(NULL), fixedInfo(NULL), trans(NULL), transSize(0) {
 		init(hInstance);
 	}
-	FileVersion(const char* filename):info(NULL), fixedInfo(NULL), trans(NULL), transSize(0) {
+	FileVersion(const TCHAR* filename):info(NULL), fixedInfo(NULL), trans(NULL), transSize(0) {
 		init(filename);
 	}
 	~FileVersion() {
@@ -152,51 +152,51 @@
 	int getCharset(int index = 0)const {
 		return validateTranslation() ? MAKELONG(trans[index * 2 + 1], trans[index * 2]) : 0;
 	}
-	const char* getString(int charset, const char* blockName)const {
-		char buffer[64];
+	const TCHAR* getString(int charset, const TCHAR* blockName)const {
+		TCHAR buffer[64];
 		wsprintf(buffer, STRINGBLOCK(), charset, blockName);
 		UINT size;
-		const char* string;
+		const TCHAR* string;
 		return ::VerQueryValue((void*) (const void*) info, buffer, (LPVOID*) &string, &size) ? string : NULL;
 	}
-	const char* getString(const char* blockName)const {
+	const TCHAR* getString(const TCHAR* blockName)const {
 		return getString(getCharset(), blockName);
 	}
 
-	const char* getComments()const {
+	const TCHAR* getComments()const {
 		return getString(COMMENTS());
 	}
-	const char* getCompanyName()const {
+	const TCHAR* getCompanyName()const {
 		return getString(COMPANYNAME());
 	}
-	const char* getFileDescription()const {
+	const TCHAR* getFileDescription()const {
 		return getString(FILEDESCRIPTION());
 	}
-	const char* getFileVersion()const {
+	const TCHAR* getFileVersion()const {
 		return getString(FILEVERSION());
 	}
-	const char* getInternalName()const {
+	const TCHAR* getInternalName()const {
 		return getString(INTERNALNAME());
 	}
-	const char* getLegalCopyright()const {
+	const TCHAR* getLegalCopyright()const {
 		return getString(LEGALCOPYRIGHT());
 	}
-	const char* getLegalTrademarks()const {
+	const TCHAR* getLegalTrademarks()const {
 		return getString(LEGALTRADEMARKS());
 	}
-	const char* getOriginalFilename()const {
+	const TCHAR* getOriginalFilename()const {
 		return getString(ORIGINALFILENAME());
 	}
-	const char* getPrivateBuild()const {
+	const TCHAR* getPrivateBuild()const {
 		return getString(PRIVATEBUILD());
 	}
-	const char* getProductName()const {
+	const TCHAR* getProductName()const {
 		return getString(PRODUCTNAME());
 	}
-	const char* getProductVersion()const {
+	const TCHAR* getProductVersion()const {
 		return getString(PRODUCTVERSION());
 	}
-	const char* getSpecialBuild()const {
+	const TCHAR* getSpecialBuild()const {
 		return getString(SPECIALBUILD());
 	}
 

Modified: branches/cmake/TTProxy/YCL/include/YCL/IniFile.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/IniFile.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/IniFile.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -24,17 +24,17 @@
 class IniFile {
 private:
 	static String YES() {
-		static const char YES[] = "yes";
+		static const TCHAR YES[] = _T("yes");
 		static String string = YES;
 		return string;
 	}
 	static String NO() {
-		static const char NO[] = "no";
+		static const TCHAR NO[] = _T("no");
 		static String string = NO;
 		return string;
 	}
-	static const char* INVALID() {
-		static const char string[] = "\n:";
+	static const TCHAR* INVALID() {
+		static const TCHAR string[] = _T("\n:");
 		return string;
 	}
 
@@ -43,16 +43,16 @@
 		Vector<String> list;
 		mutable int index;
 	public:
-		EnumKeyNames(const char* filename, const char* section):index(0) {
+		EnumKeyNames(const TCHAR* filename, const TCHAR* section):index(0) {
 			Hashtable<String, int> table;
-			int section_len = strlen(section);
-			char* buffer;
+			int section_len = _tcslen(section);
+			TCHAR* buffer;
 			size_t size = 256;
 			while ((buffer = getSectionNames(filename, size)) == NULL)
 				size += 256;
-			const char* name = buffer;
+			const TCHAR* name = buffer;
 			while (*name != '\0') {
-				if (strncmp(name, section, section_len) == 0) {
+				if (_tcsncmp(name, section, section_len) == 0) {
 					if (name[section_len] == '\\') {
 						int i;
 						name += section_len + 1;
@@ -59,8 +59,10 @@
 						for (i = 0; name[i] != '\0'; i++) {
 							if (name[i] == '\\')
 								break;
+#if !defined(UNICODE)
 							if (String::isLeadByte(name[i]))
 								i++;
+#endif
 						}
 						table.put(String(name, i), 1);
 					}
@@ -84,10 +86,10 @@
 	friend class EnumKeyNames;
 	class EnumValueNames : public Enumeration<String> {
 	private:
-		char* buffer;
-		mutable char* p;
+		TCHAR* buffer;
+		mutable TCHAR* p;
 	public:
-		EnumValueNames(const char* filename, const char* section) {
+		EnumValueNames(const TCHAR* filename, const TCHAR* section) {
 			size_t size = 256;
 			while ((buffer = getValueNames(filename, section, size)) == NULL)
 				size += 256;
@@ -140,23 +142,23 @@
             return ((IniFile*) ini)->deleteValue(name);
         }
     };
-	static char* getSectionNames(const char* filename, size_t size) {
-		char* buffer = new char[size];
+	static TCHAR* getSectionNames(const TCHAR* filename, size_t size) {
+		TCHAR* buffer = new TCHAR[size];
 		if (::GetPrivateProfileSectionNames(buffer, size, filename) < size - 2)
 			return buffer;
 		delete[] buffer;
 		return NULL;
 	}
-	static char* getValueNames(const char* filename, const char* section, size_t size) {
-		static const char null = '\0';
-		char* buffer = new char[size];
+	static TCHAR* getValueNames(const TCHAR* filename, const TCHAR* section, size_t size) {
+		static const TCHAR null = '\0';
+		TCHAR* buffer = new TCHAR[size];
 		if (::GetPrivateProfileString(section, NULL, &null, buffer, size, filename) < size - 2)
 			return buffer;
 		delete[] buffer;
 		return NULL;
 	}
-	static String getString(const char* filename, const char* section, const char* name, bool& exists, size_t size) {
-		char* buffer = (char*) alloca(size);
+	static String getString(const TCHAR* filename, const TCHAR* section, const TCHAR* name, bool& exists, size_t size) {
+		TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * size);
 		size_t len = ::GetPrivateProfileString(section, name, INVALID(), buffer, size, filename);
 		if (len < size - 2) {
 			// \x89\xFC\x8Ds\x82\xF0\x8A܂񂾕\xB6\x8E\x9A\x97\xF1\x82\xCDini\x83t\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x82͎擾\x82ł\xAB\x82Ȃ\xA2\x82̂Ŏ擾\x8E\xB8\x94s\x82\xB5\x82\xBD\x82\xB1\x82Ƃ\xAA\x95\xAA\x82\xA9\x82\xE9
@@ -170,24 +172,24 @@
 		exists = true;
 		return NULL;
 	}
-	static String generateSectionName(const char* parentSection, const char* subkeyName) {
+	static String generateSectionName(const TCHAR* parentSection, const TCHAR* subkeyName) {
 		StringBuffer buffer = parentSection;
 		buffer.append('\\');
 		buffer.append(subkeyName);
 		return buffer.toString();
 	}
-	static bool deleteAllSubsection(const char* filename, const char* section, const char* subkey) {
+	static bool deleteAllSubsection(const TCHAR* filename, const TCHAR* section, const TCHAR* subkey) {
 		String keyname = generateSectionName(section, subkey);
 		int keyname_len = keyname.length();
 
-		char* buffer;
+		TCHAR* buffer;
 		size_t size = 256;
 		while ((buffer = getSectionNames(filename, size)) == NULL)
 			size += 256;
-		const char* name = buffer;
+		const TCHAR* name = buffer;
 		bool succeeded = true;
 		while (*name != '\0') {
-			if (strncmp(name, keyname, keyname_len) == 0) {
+			if (_tcsncmp(name, keyname, keyname_len) == 0) {
 				if (name[keyname_len] == '\0' || name[keyname_len] == '\\') {
 					if (!::WritePrivateProfileString(name, NULL, NULL, filename)) {
 						succeeded = false;
@@ -209,19 +211,19 @@
 	}
 	IniFile(String filename, String section):filename(filename), section(section) {
 	}
-	IniFile(const IniFile& parent, const char* subkeyName):filename(parent.filename), section(generateSectionName(parent.section, subkeyName)) {
+	IniFile(const IniFile& parent, const TCHAR* subkeyName):filename(parent.filename), section(generateSectionName(parent.section, subkeyName)) {
 	}
 
 	bool isOpened()const {
 		return filename != NULL && section != NULL;
 	}
-	long getInteger(const char* name, long defaultValue = 0)const {
+	long getInteger(const TCHAR* name, long defaultValue = 0)const {
 		return filename != NULL && section != NULL ? ::GetPrivateProfileInt(section, name, defaultValue, filename) : defaultValue;
 	}
-	String getString(const char* name)const {
+	String getString(const TCHAR* name)const {
 		return getString(name, NULL);
 	}
-	String getString(const char* name, String defaultValue)const {
+	String getString(const TCHAR* name, String defaultValue)const {
 		if (filename != NULL && section != NULL && name != NULL) {
 			size_t size = 256;
 			String string;
@@ -233,7 +235,7 @@
 		}
 		return defaultValue;
 	}
-	bool getBoolean(const char* name, bool defaultValue = false)const {
+	bool getBoolean(const TCHAR* name, bool defaultValue = false)const {
 		String string = getString(name);
 		if (string != NULL) {
 			if (string == YES())
@@ -244,10 +246,10 @@
 		return defaultValue;
 	}
 
-	bool setInteger(const char* name, long value) {
+	bool setInteger(const TCHAR* name, long value) {
 		return setString(name, Integer::toString(value));
 	}
-	bool setString(const char* name, String value) {
+	bool setString(const TCHAR* name, String value) {
 		if (filename != NULL && section != NULL && name != NULL) {
 			// NULL\x82łȂ\xAF\x82\xEA\x82΃G\x83X\x83P\x81[\x83v\x82\xB5\x82Ă\xA9\x82\xE7""\x82Ŋ\x87\x82\xE9
 			if (value != NULL) {
@@ -262,30 +264,30 @@
 		}
 		return false;
 	}
-	bool setBoolean(const char* name, bool value) {
+	bool setBoolean(const TCHAR* name, bool value) {
 		return setString(name, value ? YES() : NO());
 	}
 
-	bool existsValue(const char* name) {
-		char buffer[3];
+	bool existsValue(const TCHAR* name) {
+		TCHAR buffer[3];
 		::GetPrivateProfileString(section, name, INVALID(), buffer, countof(buffer), filename);
 		return buffer[0] != '\n';
 	}
-	bool deleteKey(const char* name) {
+	bool deleteKey(const TCHAR* name) {
 		return filename != NULL && section != NULL && name != NULL && deleteAllSubsection(filename, section, name);
 	}
-	bool deleteValue(const char* name) {
+	bool deleteValue(const TCHAR* name) {
 		return filename != NULL && section != NULL && name != NULL
 			&& ::WritePrivateProfileString(section, name, NULL, filename) != FALSE;
 	}
 
-	bool open(String filename, String section) {
+	bool open(String _filename, String _section) {
 		close();
-		this->filename = filename;
-		this->section = section;
+		filename = _filename;
+		section = _section;
 		return isOpened();
 	}
-	bool open(const IniFile& parent, const char* subkeyName) {
+	bool open(const IniFile& parent, const TCHAR* subkeyName) {
 		close();
 		filename = parent.filename;
 		section = generateSectionName(parent.section, subkeyName);

Modified: branches/cmake/TTProxy/YCL/include/YCL/Integer.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/Integer.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/Integer.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -46,8 +46,8 @@
 	static String toString(unsigned long value, int base, bool negative) {
 		if (base < 2 || base > 36)
 			return NULL;
-		char buffer[64];
-		char* p = buffer + countof(buffer);
+		TCHAR buffer[64];
+		TCHAR* p = buffer + countof(buffer);
 		*--p = '\0';
 		if (value == 0) {
 			*--p = '0';

Modified: branches/cmake/TTProxy/YCL/include/YCL/Resource.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/Resource.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/Resource.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -10,8 +10,8 @@
 #endif // _MSC_VER >= 1000
 
 #include <YCL/common.h>
-
 #include <YCL/String.h>
+#include "codeconv.h"
 
 namespace yebisuya {
 
@@ -18,7 +18,7 @@
 class Resource {
 public:
 	static String loadString(HINSTANCE instance, UINT id, int bufsize) {
-		char* buffer = (char*) alloca(bufsize);
+		TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * bufsize);
 		int length = loadString(instance, id, buffer, bufsize);
 		if (length >= bufsize - 1)
 			return NULL;
@@ -28,10 +28,10 @@
 	}
 
 public:
-	static int loadString(UINT id, char* buffer, int bufsize) {
+	static int loadString(UINT id, TCHAR* buffer, int bufsize) {
 		return loadString(GetInstanceHandle(), id, buffer, bufsize);
 	}
-	static int loadString(HINSTANCE instance, UINT id, char* buffer, int bufsize) {
+	static int loadString(HINSTANCE instance, UINT id, TCHAR* buffer, int bufsize) {
 		return LoadString(instance, id, buffer, bufsize);
 	}
 	static String loadString(int id) {
@@ -54,10 +54,10 @@
 		return loadIcon(GetInstanceHandle(), id);
 	}
 	static HICON loadIcon(HINSTANCE instance, int id) {
-		return loadIcon(instance, MAKEINTRESOURCE(id));
+		return loadIcon(instance, MAKEINTRESOURCEA(id));
 	}
 	static HICON loadIcon(HINSTANCE instance, const char* id) {
-		return ::LoadIcon(instance, id);
+		return ::LoadIcon(instance, (tc)id);
 	}
 
 	static HICON loadIcon(int id, int cx, int cy) {
@@ -67,7 +67,7 @@
 		return loadIcon(GetInstanceHandle(), id, cx, cy);
 	}
 	static HICON loadIcon(HINSTANCE instance, int id, int cx, int cy) {
-		return loadIcon(instance, MAKEINTRESOURCE(id), cx, cy);
+		return loadIcon(instance, MAKEINTRESOURCEA(id), cx, cy);
 	}
 	static HICON loadIcon(HINSTANCE instance, const char* id, int cx, int cy) {
 		return loadIcon(instance, id, cx, cy, LR_DEFAULTCOLOR | LR_SHARED);
@@ -79,10 +79,10 @@
 		return loadIcon(GetInstanceHandle(), id, cx, cy, flags);
 	}
 	static HICON loadIcon(HINSTANCE instance, int id, int cx, int cy, int flags) {
-		return loadIcon(instance, MAKEINTRESOURCE(id), cx, cy, flags);
+		return loadIcon(instance, MAKEINTRESOURCEA(id), cx, cy, flags);
 	}
 	static HICON loadIcon(HINSTANCE instance, const char* id, int cx, int cy, int flags) {
-		return (HICON) ::LoadImage(instance, id, IMAGE_ICON, cx, cy, flags);
+		return (HICON) ::LoadImage(instance, (tc)id, IMAGE_ICON, cx, cy, flags);
 	}
 
 	static HCURSOR loadCursor(int id) {
@@ -92,10 +92,10 @@
 		return loadCursor(GetInstanceHandle(), id);
 	}
 	static HCURSOR loadCursor(HINSTANCE instance, int id) {
-		return loadCursor(instance, MAKEINTRESOURCE(id));
+		return loadCursor(instance, MAKEINTRESOURCEA(id));
 	}
 	static HCURSOR loadCursor(HINSTANCE instance, const char* id) {
-		return ::LoadCursor(instance, id);
+		return ::LoadCursor(instance, (tc)id);
 	}
 
 	static HCURSOR loadCursor(int id, int cx, int cy) {
@@ -105,7 +105,7 @@
 		return loadCursor(GetInstanceHandle(), id, cx, cy);
 	}
 	static HCURSOR loadCursor(HINSTANCE instance, int id, int cx, int cy) {
-		return loadCursor(instance, MAKEINTRESOURCE(id), cx, cy);
+		return loadCursor(instance, MAKEINTRESOURCEA(id), cx, cy);
 	}
 	static HCURSOR loadCursor(HINSTANCE instance, const char* id, int cx, int cy) {
 		return loadCursor(instance, id, cx, cy, LR_DEFAULTCOLOR | LR_SHARED);
@@ -117,10 +117,10 @@
 		return loadCursor(GetInstanceHandle(), id, cx, cy, flags);
 	}
 	static HCURSOR loadCursor(HINSTANCE instance, int id, int cx, int cy, int flags) {
-		return loadCursor(instance, MAKEINTRESOURCE(id), cx, cy, flags);
+		return loadCursor(instance, MAKEINTRESOURCEA(id), cx, cy, flags);
 	}
 	static HCURSOR loadCursor(HINSTANCE instance, const char* id, int cx, int cy, int flags) {
-		return (HCURSOR) ::LoadImage(instance, id, IMAGE_CURSOR, cx, cy, flags);
+		return (HCURSOR) ::LoadImage(instance, (tc)id, IMAGE_CURSOR, cx, cy, flags);
 	}
 
 	static HMENU loadMenu(int id) {
@@ -130,10 +130,10 @@
 		return loadMenu(GetInstanceHandle(), id);
 	}
 	static HMENU loadMenu(HINSTANCE instance, int id) {
-		return loadMenu(instance, MAKEINTRESOURCE(id));
+		return loadMenu(instance, MAKEINTRESOURCEA(id));
 	}
 	static HMENU loadMenu(HINSTANCE instance, const char* id) {
-		return ::LoadMenu(instance, id);
+		return ::LoadMenu(instance, (tc)id);
 	}
 };
 

Modified: branches/cmake/TTProxy/YCL/include/YCL/String.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/String.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/String.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -12,6 +12,7 @@
 #include <YCL/common.h>
 
 #include <string.h>
+#include <tchar.h>
 
 namespace yebisuya {
 
@@ -21,7 +22,7 @@
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x83o\x83b\x83t\x83@\x81B
 	// \x95\xB6\x8E\x9A\x97\xF1\x82̑O\x82ɂ͎Q\x8FƃJ\x83E\x83\x93\x83^\x82\xF0\x8E\x9D\x82\xBF\x81A
 	// \x91\xE3\x93\xFC\x82\xE2\x94j\x8A\xFC\x82̍ۂɂ͂\xBB\x82\xB1\x82\xF0\x95ύX\x82\xB7\x82\xE9\x81B
-	const char* string;
+	const TCHAR* string;
 
 	// utilities
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x83o\x83b\x83t\x83@\x82\xF0\x8D쐬\x82\xB7\x82\xE9\x81B
@@ -31,10 +32,10 @@
 	//	length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B
 	// \x95Ԓl:
 	//	\x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97񕔂̃A\x83h\x83\x8C\x83X\x81B
-	static char* createBuffer(size_t length) {
-		size_t* count = (size_t*) new unsigned char[sizeof (size_t) + sizeof (char) * (length + 1)];
+	static TCHAR* createBuffer(size_t length) {
+		size_t* count = (size_t*) new TCHAR[sizeof (size_t) + sizeof (TCHAR) * (length + 1)];
 		*count = 0;
-		return (char*) (count + 1);
+		return (TCHAR*) (count + 1);
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82\xF0\x8D쐬\x82\xB7\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -41,8 +42,8 @@
 	//	source \x8Ai\x94[\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97񕔂̃A\x83h\x83\x8C\x83X\x81B
-	static const char* create(const char* source) {
-		return source != NULL ? create(source, strlen(source)) : NULL;
+	static const TCHAR* create(const TCHAR* source) {
+		return source != NULL ? create(source, _tcslen(source)) : NULL;
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82\xF0\x8D쐬\x82\xB7\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -50,10 +51,10 @@
 	//	length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B
 	// \x95Ԓl:
 	//	\x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97񕔂̃A\x83h\x83\x8C\x83X\x81B
-	static const char* create(const char* source, size_t length) {
+	static const TCHAR* create(const TCHAR* source, size_t length) {
 		if (source != NULL) {
-			char* buffer = createBuffer(length);
-			memcpy(buffer, source, length);
+			TCHAR* buffer = createBuffer(length);
+			memcpy(buffer, source, sizeof(TCHAR) * length);
 			buffer[length] = '\0';
 			return buffer;
 		}
@@ -65,12 +66,12 @@
 	//	str2 \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1(\x8C\xE3)\x81B
 	// \x95Ԓl:
 	//	\x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97񕔂̃A\x83h\x83\x8C\x83X\x81B
-	static const char* concat(const char* str1, const char* str2) {
-		size_t len1 = strlen(str1);
-		size_t len2 = strlen(str2);
-		char* buffer = createBuffer(len1 + len2);
-		memcpy(buffer, str1, len1);
-		memcpy(buffer + len1, str2, len2);
+	static const TCHAR* concat(const TCHAR* str1, const TCHAR* str2) {
+		size_t len1 = _tcslen(str1);
+		size_t len2 = _tcslen(str2);
+		TCHAR* buffer = createBuffer(len1 + len2);
+		memcpy(buffer, str1, sizeof(TCHAR) * len1);
+		memcpy(buffer + len1, str2, sizeof(TCHAR) * len2);
 		buffer[len1 + len2] = '\0';
 		return buffer;
 	}
@@ -80,7 +81,7 @@
 		if (string != NULL) {
 			size_t* count = (size_t*) string - 1;
 			if (--*count == 0)
-				delete[] (unsigned char*) count;
+				delete[] (TCHAR*) count;
 		}
 	}
 	// \x8EQ\x8FƃJ\x83E\x83\x93\x83^\x82𑝂₷\x81B
@@ -95,7 +96,7 @@
 	// \x90V\x82\xB5\x82\xA2\x83o\x83b\x83t\x83@\x82̎Q\x8FƃJ\x83E\x83\x93\x83^\x82𑝂₷\x81B
 	// \x88\xF8\x90\x94:
 	//	source \x92u\x82\xAB\x8A\xB7\x82\xA6\x82\xE9\x90V\x82\xB5\x82\xA2\x83o\x83b\x83t\x83@\x81B
-	void set(const char* source) {
+	void set(const TCHAR* source) {
 		if (string != source) {
 			release();
 			string = source;
@@ -111,7 +112,7 @@
 	// \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ew\x92肷\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
 	// \x88\xF8\x90\x94:
 	//	source \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x81B
-	String(const char* source):string(NULL) {
+	String(const TCHAR* source):string(NULL) {
 		set(create(source));
 	}
 	// \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x82𒷂\xB3\x95t\x82\xAB\x82Ŏw\x92肷\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
@@ -118,7 +119,7 @@
 	// \x88\xF8\x90\x94:
 	//	source \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x81B
 	//	length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B
-	String(const char* source, size_t length):string(NULL) {
+	String(const TCHAR* source, size_t length):string(NULL) {
 		set(create(source, length));
 	}
 	// \x83R\x83s\x81[\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
@@ -131,7 +132,7 @@
 	// \x88\xF8\x90\x94:
 	//	str1 \x91O\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B
 	//	str2 \x8C\xE3\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B
-	String(const char* str1, const char* str2):string(NULL) {
+	String(const TCHAR* str1, const TCHAR* str2):string(NULL) {
 		set(concat(str1, str2));
 	}
 	// \x93\xF1\x82‚̕\xB6\x8E\x9A\x97\xF1\x82\xF0\x98A\x8C\x8B\x82\xB7\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
@@ -138,7 +139,7 @@
 	// \x88\xF8\x90\x94:
 	//	str1 \x91O\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B
 	//	str2 \x8C\xE3\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B
-	String(const String& str1, const char* str2):string(NULL) {
+	String(const String& str1, const TCHAR* str2):string(NULL) {
 		set(*str2 != '\0' ? concat(str1.string, str2) : str1.string);
 	}
 	// destructor
@@ -153,7 +154,7 @@
 	//	source \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x98A\x8C\x8B\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x81B
-	String concat(const char* source)const {
+	String concat(const TCHAR* source)const {
 		return String(*this, source);
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x8Ds\x82\xA4\x81B
@@ -162,12 +163,12 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82\xCE0\x81Astr\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82Ε\x89\x81A\x8F\xAC\x82\xB3\x82\xAF\x82\xEA\x82ΐ\xB3\x81B
-	int compareTo(const char* str)const {
+	int compareTo(const TCHAR* str)const {
 		if (str == NULL)
 			return string == NULL ? 0 : 1;
 		else if (string == NULL)
 			return -1;
-		return strcmp(string, str);
+		return _tcscmp(string, str);
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x91啶\x8E\x9A\x8F\xAC\x95\xB6\x8E\x9A\x82̋\xE6\x95ʂȂ\xB5\x82ōs\x82\xA4\x81B
 	// NULL\x82Ƃ\xE0\x94\xE4\x8Ar\x82ł\xAB\x82\xE9\x81B
@@ -175,12 +176,12 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82\xCE0\x81Astr\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82Ε\x89\x81A\x8F\xAC\x82\xB3\x82\xAF\x82\xEA\x82ΐ\xB3\x81B
-	int compareToIgnoreCase(const char* str)const {
+	int compareToIgnoreCase(const TCHAR* str)const {
 		if (str == NULL)
 			return string == NULL ? 0 : 1;
 		else if (string == NULL)
 			return -1;
-		return _stricmp(string, str);
+		return _tcsicmp(string, str);
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x8Ds\x82\xA4\x81B
 	// NULL\x82Ƃ\xE0\x94\xE4\x8Ar\x82ł\xAB\x82\xE9\x81B
@@ -188,7 +189,7 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool equals(const char* str)const {
+	bool equals(const TCHAR* str)const {
 		return compareTo(str) == 0;
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x91啶\x8E\x9A\x8F\xAC\x95\xB6\x8E\x9A\x82̋\xE6\x95ʂȂ\xB5\x82ōs\x82\xA4\x81B
@@ -197,7 +198,7 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool equalsIgnoreCase(const char* str)const {
+	bool equalsIgnoreCase(const TCHAR* str)const {
 		return compareToIgnoreCase(str) == 0;
 	}
 	// \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9\x82𔻒肷\x82\xE9\x81B
@@ -205,7 +206,7 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82\xEA\x82ΐ^\x81B
-	bool startsWith(const char* str)const {
+	bool startsWith(const TCHAR* str)const {
 		return startsWith(str, 0);
 	}
 	// \x8Ew\x92\xE8\x82̈ʒu\x82\xA9\x82\xE7\x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9\x82𔻒肷\x82\xE9\x81B
@@ -213,8 +214,8 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82\xEA\x82ΐ^\x81B
-	bool startsWith(const char* str, int offset)const {
-		return strncmp(string, str, strlen(str)) == 0;
+	bool startsWith(const TCHAR* str, int offset)const {
+		return _tcsncmp(string, str, _tcslen(str)) == 0;
 	}
 	// \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82ŏI\x82\xED\x82\xC1\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9\x82𔻒肷\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -221,13 +222,13 @@
 	//	str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82ŏI\x82\xED\x82\xC1\x82Ă\xA2\x82\xEA\x82ΐ^\x81B
-	// 
-	bool endsWith(const char* str)const {
-		size_t str_length = strlen(str);
+	//
+	bool endsWith(const TCHAR* str)const {
+		size_t str_length = _tcslen(str);
 		size_t string_length = length();
 		if (string_length < str_length)
 			return false;
-		return strcmp(string + string_length - str_length, str) == 0;
+		return _tcscmp(string + string_length - str_length, str) == 0;
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x82ǂ̈ʒu\x82ɂ\xA0\x82邩\x82\xF0\x92T\x82\xB7\x81B
 	// \x88\xF8\x90\x94:
@@ -234,7 +235,7 @@
 	//	chr \x92T\x82\xB7\x95\xB6\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int indexOf(char chr)const {
+	int indexOf(TCHAR chr)const {
 		return indexOf(chr, 0);
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x82ǂ̈ʒu\x82ɂ\xA0\x82邩\x82\xF0\x8Ew\x92\xE8\x82̈ʒu\x82\xA9\x82\xE7\x92T\x82\xB7\x81B
@@ -243,12 +244,10 @@
 	//	from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int indexOf(char chr, size_t from)const {
-		if (from < 0)
-			from = 0;
-		else if (from >= length())
+	int indexOf(TCHAR chr, size_t from)const {
+		if (from >= length())
 			return -1;
-		const char* found = strchr(string + from, chr);
+		const TCHAR* found = _tcschr(string + from, chr);
 		if (found == NULL)
 			return -1;
 		return found - string;
@@ -258,7 +257,7 @@
 	//	str \x92T\x82\xB7\x95\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int indexOf(const char* str)const {
+	int indexOf(const TCHAR* str)const {
 		return indexOf(str, 0);
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x97񂪂ǂ̈ʒu\x82ɂ\xA0\x82邩\x82\xF0\x8Ew\x92\xE8\x82̈ʒu\x82\xA9\x82\xE7\x92T\x82\xB7\x81B
@@ -267,13 +266,11 @@
 	//	from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	// 
-	int indexOf(const char* str, size_t from)const {
-		if (from < 0)
-			from = 0;
-		else if (from >= length())
+	//
+	int indexOf(const TCHAR* str, size_t from)const {
+		if (from >= length())
 			return -1;
-		const char* found = strstr(string + from, str);
+		const TCHAR* found = _tcsstr(string + from, str);
 		if (found == NULL)
 			return -1;
 		return found - string;
@@ -280,7 +277,7 @@
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x82\xF0\x95Ԃ\xB7\x81B
 	size_t length()const {
-		return strlen(string);
+		return _tcslen(string);
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x8DŌ\xE3\x82Ɍ\xA9\x82‚\xA9\x82\xE9\x88ʒu\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -287,7 +284,7 @@
 	//	chr \x92T\x82\xB7\x95\xB6\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int lastIndexOf(char chr)const {
+	int lastIndexOf(TCHAR chr)const {
 		return lastIndexOf(chr, (size_t) -1);
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x8Ew\x92\xE8\x82̈ʒu\x82\xE6\x82\xE8\x82\xE0\x91O\x82ōŌ\xE3\x82Ɍ\xA9\x82‚\xA9\x82\xE9\x88ʒu\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
@@ -296,18 +293,20 @@
 	//	from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int lastIndexOf(char chr, size_t from)const {
+	int lastIndexOf(TCHAR chr, size_t from)const {
 		size_t len = length();
 		if (from > len - 1)
 			from = len - 1;
-		const char* s = string;
-		const char* end = string + from;
-		const char* found = NULL;
+		const TCHAR* s = string;
+		const TCHAR* end = string + from;
+		const TCHAR* found = NULL;
 		while (*s != '0' && s <= end) {
 			if (*s == chr)
 				found = s;
+#if !defined(UNICODE)
 			if (isLeadByte(*s))
 				s++;
+#endif
 			s++;
 		}
 		return found != NULL ? found - string : -1;
@@ -317,7 +316,7 @@
 	//	str \x92T\x82\xB7\x95\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int lastIndexOf(const char* str)const {
+	int lastIndexOf(const TCHAR* str)const {
 		return lastIndexOf(str, (size_t) -1);
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x97񂪎w\x92\xE8\x82̈ʒu\x82\xE6\x82\xE8\x82\xE0\x91O\x82ōŌ\xE3\x82Ɍ\xA9\x82‚\xA9\x82\xE9\x88ʒu\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
@@ -326,14 +325,14 @@
 	//	from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82‚\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B
-	int lastIndexOf(const char* str, size_t from)const {
+	int lastIndexOf(const TCHAR* str, size_t from)const {
 		size_t len = length();
-		size_t str_len = strlen(str);
+		size_t str_len = _tcslen(str);
 		if (from > len - str_len)
 			from = len - str_len;
-		const char* s = string + from;
+		const TCHAR* s = string + from;
 		while (s >= string) {
-			if (strncmp(s, str, str_len) == 0)
+			if (_tcsncmp(s, str, str_len) == 0)
 				return s - string;
 			s--;
 		}
@@ -361,8 +360,8 @@
 	//	index \x8E\xE6\x82\xE8\x8Fo\x82\xB7\x95\xB6\x8E\x9A\x82̈ʒu\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92\xE8\x82̈ʒu\x82ɂ\xA0\x82镶\x8E\x9A\x81B
-	char charAt(size_t index)const {
-		return index >= 0 && index < length() ? string[index] : '\0';
+	TCHAR TCHARAt(size_t index)const {
+		return index < length() ? string[index] : '\0';
 	}
 	// \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xF0\x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82ɒu\x82\xAB\x8A\xB7\x82\xA6\x82܂\xB7\x81B
 	// \x88\xF8\x90\x94:
@@ -370,13 +369,16 @@
 	//	newChr \x92u\x82\xAB\x8A\xB7\x82\xA6\x82镶\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x92u\x8A\xB7\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B
-	String replace(char oldChr, char newChr)const {
+	String replace(TCHAR oldChr, TCHAR newChr)const {
 		String result(string);
-		char* s = (char*) result.string;
+		TCHAR* s = (TCHAR*) result.string;
 		while (*s != '\0'){
+#if !defined(UNICODE)
 			if (String::isLeadByte(*s))
 				s++;
-			else if (*s == oldChr)
+			else
+#endif
+			if (*s == oldChr)
 				*s = newChr;
 			s++;
 		}
@@ -387,11 +389,14 @@
 	//	\x95ϊ\xB7\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B
 	String toLowerCase()const {
 		String result(string);
-		char* s = (char*) result.string;
+		TCHAR* s = (TCHAR*) result.string;
 		while (*s != '\0'){
+#if !defined(UNICODE)
 			if (String::isLeadByte(*s))
 				s++;
-			else if ('A' <= *s && *s <= 'Z')
+			else 
+#endif
+			if ('A' <= *s && *s <= 'Z')
 				*s += 'a' - 'A';
 			s++;
 		}
@@ -402,12 +407,15 @@
 	//	\x95ϊ\xB7\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B
 	String toUpperCase()const {
 		String result(string);
-		char* s = (char*) result.string;
+		TCHAR* s = (TCHAR*) result.string;
 		while (*s != '\0'){
+#if !defined(UNICODE)
 			if (String::isLeadByte(*s))
 				s++;
-			else if ('a' <= *s && *s <= 'z')
-				*s += 'A' - 'a';
+			else
+#endif
+			if (_T('a') <= *s && *s <= _T('z'))
+				*s += _T('A') - _T('a');
 			s++;
 		}
 		return result;
@@ -416,12 +424,12 @@
 	// \x95Ԓl:
 	//	\x8D폜\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B
 	String trim()const {
-		const char* s = string;
-		while (*s != '\0' && (unsigned char) *s <= ' ')
+		const TCHAR* s = string;
+		while (*s != '\0' && (TCHAR) *s <= _T(' '))
 			s++;
-		const char* start = s;
+		const TCHAR* start = s;
 		s = string + length();
-		while (s > start && (*s != '\0' && (unsigned char) *s <= ' '))
+		while (s > start && (*s != '\0' && (TCHAR) *s <= _T(' ')))
 			s--;
 		return String(start, s - start);
 	}
@@ -428,19 +436,19 @@
 
 	// operators
 
-	// const char*\x82ւ̃L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq
+	// const TCHAR*\x82ւ̃L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq
 	// \x95Ԓl:
 	//	\x95\xB6\x8E\x9A\x97\xF1\x82ւ̃A\x83h\x83\x8C\x83X\x81B
-	operator const char*()const {
+	operator const TCHAR*()const {
 		return string;
 	}
-	// char\x94z\x97\xF1\x82̂悤\x82Ɉ\xB5\x82\xA4\x82\xBD\x82߂\xCC[]\x89\x89\x8EZ\x8Eq\x81B
+	// TCHAR\x94z\x97\xF1\x82̂悤\x82Ɉ\xB5\x82\xA4\x82\xBD\x82߂\xCC[]\x89\x89\x8EZ\x8Eq\x81B
 	// \x88\xF8\x90\x94:
 	//	index \x8E擾\x82\xB7\x82镶\x8E\x9A\x82̃C\x83\x93\x83f\x83b\x83N\x83X\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92\xE8\x82̃C\x83\x93\x83f\x83b\x83N\x83X\x82ɂ\xA0\x82镶\x8E\x9A\x81B
-	char operator[](size_t index)const {
-		return charAt(index);
+	TCHAR operator[](size_t index)const {
+		return TCHARAt(index);
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x98A\x8C\x8B\x82\xB7\x82邽\x82߂\xCC+\x89\x89\x8EZ\x8Eq\x81B
 	// \x88\xF8\x90\x94:
@@ -447,7 +455,7 @@
 	//	source \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x98A\x8C\x8B\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x81B
-	String operator+(const char* source)const {
+	String operator+(const TCHAR* source)const {
 		return String(string, source);
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x98A\x8C\x8B\x82\xB7\x82邽\x82߂\xCC+\x89\x89\x8EZ\x8Eq\x81B
@@ -464,7 +472,7 @@
 	//	str2 \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1(\x8C\xE3)\x81B
 	// \x95Ԓl:
 	//	\x98A\x8C\x8B\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x81B
-	friend String operator+(const char* str1, const String& str2) {
+	friend String operator+(const TCHAR* str1, const String& str2) {
 		return *str1 != '\0' ? String(str1, str2.string) : str2;
 	}
 	// \x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B
@@ -472,7 +480,7 @@
 	//	source \x91\xE3\x93\xFC\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x91\xE3\x93\xFC\x8C\x8B\x89ʁB
-	String& operator=(const char* source) {
+	String& operator=(const TCHAR* source) {
 		set(create(source));
 		return *this;
 	}
@@ -490,7 +498,7 @@
 	//	source \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x98A\x8C\x8B\x8C\x8B\x89ʁB
-	String& operator+=(const char* source) {
+	String& operator+=(const TCHAR* source) {
 		if (*source != '\0')
 			set(concat(string, source));
 		return *this;
@@ -508,7 +516,7 @@
 	//	str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str\x82̕\x{30AA4D9}\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool operator==(const char* str)const {
+	bool operator==(const TCHAR* str)const {
 		return compareTo(str) == 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -517,7 +525,7 @@
 	//	str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str1\x82\xE6\x82\xE8str2\x82̕\x{30AA4D9}\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	friend bool operator==(const char* str1, const String& str2) {
+	friend bool operator==(const TCHAR* str1, const String& str2) {
 		return str2.compareTo(str1) == 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -533,7 +541,7 @@
 	//	str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str\x82̕\x{30AA4D9}\x82\xB5\x82\xAD\x82Ȃ\xAF\x82\xEA\x82ΐ^\x81B
-	bool operator!=(const char* str)const {
+	bool operator!=(const TCHAR* str)const {
 		return compareTo(str) != 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -542,7 +550,7 @@
 	//	str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str1\x82\xE6\x82\xE8str2\x82̕\x{30AA4D9}\x82\xB5\x82\xAD\x82Ȃ\xAF\x82\xEA\x82ΐ^\x81B
-	friend bool operator!=(const char* str1, const String& str2) {
+	friend bool operator!=(const TCHAR* str1, const String& str2) {
 		return str2.compareTo(str1) != 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -558,7 +566,7 @@
 	//	str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool operator<(const char* str)const {
+	bool operator<(const TCHAR* str)const {
 		return compareTo(str) < 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -567,7 +575,7 @@
 	//	str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str1\x82\xE6\x82\xE8str2\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82ΐ^\x81B
-	friend bool operator<(const char* str1, const String& str2) {
+	friend bool operator<(const TCHAR* str1, const String& str2) {
 		return str2.compareTo(str1) > 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -583,7 +591,7 @@
 	//	str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str\x82̕\xFB\x82\xAA\x91傫\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool operator<=(const char* str)const {
+	bool operator<=(const TCHAR* str)const {
 		return compareTo(str) <= 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -592,7 +600,7 @@
 	//	str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str1\x82\xE6\x82\xE8str2\x82̕\xFB\x82\xAA\x91傫\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	friend bool operator<=(const char* str1, const String& str2) {
+	friend bool operator<=(const TCHAR* str1, const String& str2) {
 		return str2.compareTo(str1) >= 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -608,7 +616,7 @@
 	//	str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str\x82̕\x{30AA3EC}\x82\xB3\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool operator>(const char* str)const {
+	bool operator>(const TCHAR* str)const {
 		return compareTo(str) > 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -617,7 +625,7 @@
 	//	str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str1\x82\xE6\x82\xE8str2\x82̕\x{30AA3EC}\x82\xB3\x82\xAF\x82\xEA\x82ΐ^\x81B
-	friend bool operator>(const char* str1, const String& str2) {
+	friend bool operator>(const TCHAR* str1, const String& str2) {
 		return str2.compareTo(str1) < 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -633,7 +641,7 @@
 	//	str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str\x82̕\x{30AA3EC}\x82\xB3\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	bool operator>=(const char* str)const {
+	bool operator>=(const TCHAR* str)const {
 		return compareTo(str) >= 0;
 	}
 	// \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B
@@ -642,7 +650,7 @@
 	//	str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	str1\x82\xE6\x82\xE8str2\x82̕\x{30AA3EC}\x82\xB3\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B
-	friend bool operator>=(const char* str1, const String& str2) {
+	friend bool operator>=(const TCHAR* str1, const String& str2) {
 		return str2.compareTo(str1) <= 0;
 	}
 
@@ -653,7 +661,8 @@
 	//	\x94\xBB\x92肷\x82\xE9\x83o\x83C\x83g\x81B
 	// \x95Ԓl:
 	//	2\x83o\x83C\x83g\x95\xB6\x8E\x9A\x82̍ŏ\x89\x82\xCC1\x83o\x83C\x83g\x82ł\xA0\x82\xEA\x82ΐ^\x81B
-	static bool isLeadByte(char ch) {
+#if !defined(UNICODE)
+	static bool isLeadByte(TCHAR ch) {
 	#ifdef _INC_WINDOWS
 		return ::IsDBCSLeadByte(ch) != 0;
 	#else
@@ -660,6 +669,7 @@
 		return (ch & 0x80) != 0;
 	#endif
 	}
+#endif
 };
 
 }

Modified: branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -14,6 +14,7 @@
 #include <YCL/String.h>
 
 #include <malloc.h>
+#include <tchar.h>
 
 namespace yebisuya {
 
@@ -21,7 +22,7 @@
 class StringBuffer {
 private:
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x83o\x83b\x83t\x83@\x81B
-	char* buffer;
+	TCHAR* buffer;
 	// \x8C\xBB\x8DݗL\x8C\xF8\x82ȕ\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B
 	size_t validLength;
 	// \x83o\x83b\x83t\x83@\x82̑傫\x82\xB3\x81B
@@ -35,7 +36,7 @@
 	//	source	\x8F\x89\x8A\x{257639A}\x97\xF1\x81B
 	//	length	\x8F\x89\x8A\x{257639A}\x97\xF1\x82̒\xB7\x82\xB3\x81B
 	//	capacity	\x83o\x83b\x83t\x83@\x82̏\x89\x8A\xFA\x83T\x83C\x83Y\x81B
-	void init(const char* source, size_t length, size_t capacity) {
+	void init(const TCHAR* source, size_t length, size_t capacity) {
 		if ((capacity != 0 || length != 0) && capacity < length + INIT_CAPACITY)
 			capacity = length + INIT_CAPACITY;
 		validLength = length;
@@ -43,10 +44,10 @@
 		if (bufferSize == 0) {
 			buffer = NULL;
 		}else{
-			buffer = new char[bufferSize];
+			buffer = new TCHAR[bufferSize];
 		}
-		memcpy(buffer, source, validLength);
-		memset(buffer + validLength, '\0', bufferSize - validLength);
+		memcpy(buffer, source, sizeof(TCHAR) * validLength);
+		memset(buffer + validLength, '\0', sizeof(TCHAR) * (bufferSize - validLength));
 	}
 public:
 	// \x83f\x83t\x83H\x83\x8B\x83g\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
@@ -62,8 +63,8 @@
 	// \x83o\x83b\x83t\x83@\x82̏\x89\x8A\x{257639A}\x97\xF1\x82\xF0\x8Ew\x92肷\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
 	// \x88\xF8\x90\x94:
 	//	source	\x8F\x89\x8A\x{257639A}\x97\xF1\x81B
-	StringBuffer(const char* source) {
-		init(source, strlen(source), 0);
+	StringBuffer(const TCHAR* source) {
+		init(source, _tcslen(source), 0);
 	}
 	// \x83R\x83s\x81[\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B
 	// \x88\xF8\x90\x94:
@@ -93,7 +94,7 @@
 	//	newLength	\x92\xB2\x90߂\xB7\x82钷\x82\xB3\x81B
 	void ensureCapacity(size_t newLength) {
 		if (bufferSize < newLength) {
-			char* oldBuffer = buffer;
+			TCHAR* oldBuffer = buffer;
 			init(oldBuffer, validLength, newLength + INIT_CAPACITY);
 			delete[] oldBuffer;
 		}
@@ -111,8 +112,8 @@
 	//	index	\x95\xB6\x8E\x9A\x82̈ʒu\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x81B
-	char charAt(size_t index)const {
-		return index >= 0 && index < validLength ? buffer[index] : '\0';
+	TCHAR charAt(size_t index)const {
+		return index < validLength ? buffer[index] : '\0';
 	}
 	// \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -119,10 +120,8 @@
 	//	index	\x95\xB6\x8E\x9A\x82̈ʒu\x81B
 	// \x95Ԓl:
 	//	\x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x82̎Q\x8FƁB
-	char& charAt(size_t index) {
-		if (index < 0) {
-			index = 0;
-		}else if (index >= validLength) {
+	TCHAR& charAt(size_t index) {
+		if (index >= validLength) {
 			ensureCapacity(validLength + 1);
 			index = validLength++;
 		}
@@ -132,7 +131,7 @@
 	// \x88\xF8\x90\x94:
 	//	index	\x95ύX\x82\xB7\x82镶\x8E\x9A\x82̈ʒu\x81B
 	//	chr	\x95ύX\x82\xB7\x82镶\x8E\x9A\x81B
-	void setCharAt(int index, char chr) {
+	void setCharAt(int index, TCHAR chr) {
 		charAt(index) = chr;
 	}
 	// \x95\xB6\x8E\x9A\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9\x81B
@@ -140,7 +139,7 @@
 	//	chr	\x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x92lj\xC1\x8C\x8B\x89ʁB
-	StringBuffer& append(char chr) {
+	StringBuffer& append(TCHAR chr) {
 		charAt(validLength) = chr;
 		return *this;
 	}
@@ -149,8 +148,8 @@
 	//	source	\x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x92lj\xC1\x8C\x8B\x89ʁB
-	StringBuffer& append(const char* source) {
-		return append(source, strlen(source));
+	StringBuffer& append(const TCHAR* source) {
+		return append(source, _tcslen(source));
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -158,10 +157,10 @@
 	//	length	\x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B
 	// \x95Ԓl:
 	//	\x92lj\xC1\x8C\x8B\x89ʁB
-	StringBuffer& append(const char* source, size_t length) {
+	StringBuffer& append(const TCHAR* source, size_t length) {
 		size_t oldLength = validLength;
 		ensureCapacity(validLength + length);
-		memcpy(buffer + oldLength, source, length);
+		memcpy(buffer + oldLength, source, sizeof(TCHAR) * length);
 		validLength += length;
 		return *this;
 	}
@@ -184,7 +183,7 @@
 			start = 0;
 		if (start < end) {
 			if (end < validLength){
-				memcpy(buffer + start, buffer + end, validLength - end);
+				memcpy(buffer + start, buffer + end, sizeof(TCHAR) * (validLength - end));
 				validLength -= end - start;
 			}else{
 				validLength = start;
@@ -199,17 +198,15 @@
 	//	source	\x92u\x8A\xB7\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x92u\x8A\xB7\x8C\x8B\x89ʁB
-	StringBuffer& replace(size_t start, size_t end, const char* source) {
-		if (start < 0)
-			start = 0;
+	StringBuffer& replace(size_t start, size_t end, const TCHAR* source) {
 		if (end > validLength)
 			end = validLength;
 		if (start < end) {
-			size_t length = strlen(source);
+			size_t length = _tcslen(source);
 			size_t oldLength = validLength;
 			ensureCapacity(validLength += length - (end - start));
-			memcpy(buffer + start + length, buffer + end, oldLength - end);
-			memcpy(buffer + start, source, length);
+			memcpy(buffer + start + length, buffer + end, sizeof(TCHAR) * (oldLength - end));
+			memcpy(buffer + start, source, sizeof(TCHAR) * length);
 		}
 		return *this;
 	}
@@ -219,8 +216,6 @@
 	// \x95Ԓl:
 	//	\x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x97\xF1\x81B
 	String substring(size_t index)const {
-		if (index < 0)
-			index = 0;
 		return String(buffer + index, validLength - index);
 	}
 	// \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x97\xF1\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
@@ -230,8 +225,6 @@
 	// \x95Ԓl:
 	//	\x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x97\xF1\x81B
 	String substring(size_t start, size_t end)const {
-		if (start < 0)
-			start = 0;
 		if (end > validLength)
 			end = validLength;
 		return String(buffer + start, end - start);
@@ -242,7 +235,7 @@
 	//	source	\x91}\x93\xFC\x82\xB7\x82镶\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x91}\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& insert(size_t index, char chr) {
+	StringBuffer& insert(size_t index, TCHAR chr) {
 		return insert(index, &chr, 1);
 	}
 	// \x8Ew\x92\xE8\x82̈ʒu\x82ɕ\xB6\x8E\x9A\x97\xF1\x82\xF0\x91}\x93\xFC\x82\xB7\x82\xE9\x81B
@@ -251,8 +244,8 @@
 	//	source	\x91}\x93\xFC\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x91}\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& insert(size_t index, const char* source) {
-		return insert(index, source, strlen(source));
+	StringBuffer& insert(size_t index, const TCHAR* source) {
+		return insert(index, source, _tcslen(source));
 	}
 	// \x8Ew\x92\xE8\x82̈ʒu\x82ɕ\xB6\x8E\x9A\x97\xF1\x82\xF0\x91}\x93\xFC\x82\xB7\x82\xE9\x81B
 	// \x88\xF8\x90\x94:
@@ -261,17 +254,15 @@
 	//	length	\x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B
 	// \x95Ԓl:
 	//	\x91}\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& insert(size_t index, const char* source, size_t length) {
-		if (index < 0)
-			index = 0;
-		else if (index >= validLength)
+	StringBuffer& insert(size_t index, const TCHAR* source, size_t length) {
+		if (index >= validLength)
 			index = validLength;
 		size_t oldLength = validLength;
 		ensureCapacity(validLength + length);
-		char* temp = (char*) alloca(oldLength - index);
-		memcpy(temp, buffer + index, oldLength - index);
-		memcpy(buffer + index, source, length);
-		memcpy(buffer + index + length, temp, oldLength - index);
+		TCHAR* temp = (TCHAR*) alloca(sizeof(TCHAR) * (oldLength - index));
+		memcpy(temp, buffer + index, sizeof(TCHAR) * (oldLength - index));
+		memcpy(buffer + index, source, sizeof(TCHAR) * length);
+		memcpy(buffer + index + length, temp, sizeof(TCHAR) * (oldLength - index));
 		validLength += length;
 		return *this;
 	}
@@ -279,19 +270,22 @@
 	// \x95Ԓl:
 	//	\x94\xBD\x93]\x8C\x8B\x89ʁB
 	StringBuffer& reverse() {
-		char* temporary = (char*) alloca(sizeof (char) * validLength);
-		char* dst = temporary + validLength;
-		char* src = buffer;
+		TCHAR* temporary = (TCHAR*) alloca(sizeof (TCHAR) * validLength);
+		TCHAR* dst = temporary + validLength;
+		TCHAR* src = buffer;
 		while (temporary < dst) {
+#if !defined(UNICODE)
 			if (String::isLeadByte(*src)) {
-				char pre = *src++;
+				TCHAR pre = *src++;
 				*--dst = *src++;
 				*--dst = pre;
-			}else{
+			}else
+#endif
+			{
 				*--dst = *src++;
 			}
 		}
-		memcpy(buffer, temporary, validLength);
+		memcpy(buffer, temporary, sizeof(TCHAR) * validLength);
 		return *this;
 	}
 	// \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
@@ -306,7 +300,7 @@
 	//	\x95ύX\x82\xB7\x82\xE9\x88ꕶ\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x95ύX\x8C\x8B\x89ʁB
-	StringBuffer& set(char chr) {
+	StringBuffer& set(TCHAR chr) {
 		ensureCapacity(1);
 		buffer[0] = chr;
 		validLength = 1;
@@ -317,18 +311,18 @@
 	//	source	\x95ύX\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x95ύX\x8C\x8B\x89ʁB
-	StringBuffer& set(const char* source) {
-		size_t length = strlen(source);
+	StringBuffer& set(const TCHAR* source) {
+		size_t length = _tcslen(source);
 		ensureCapacity(validLength = length);
-		memcpy(buffer, source, length);
+		memcpy(buffer, source, sizeof(TCHAR) * length);
 		return *this;
 	}
 
-	// char*\x82ɕϊ\xB7\x82\xB7\x82\xE9\x83L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq\x81B
+	// TCHAR*\x82ɕϊ\xB7\x82\xB7\x82\xE9\x83L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq\x81B
 	// \x83o\x83b\x83t\x83@\x82̃A\x83h\x83\x8C\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B
 	// \x95Ԓl:
 	//	\x83o\x83b\x83t\x83@\x82̃A\x83h\x83\x8C\x83X\x81B
-	operator char*() {
+	operator TCHAR*() {
 		return buffer;
 	}
 	// String\x82ɕϊ\xB7\x82\xB7\x82\xE9\x83L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq\x81B
@@ -344,7 +338,7 @@
 	//	ch	\x95ύX\x82\xB7\x82\xE9\x88ꕶ\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x91\xE3\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& operator=(char ch) {
+	StringBuffer& operator=(TCHAR ch) {
 		return set(ch);
 	}
 	// \x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B
@@ -353,7 +347,7 @@
 	//	source	\x95ύX\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x91\xE3\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& operator=(const char* source) {
+	StringBuffer& operator=(const TCHAR* source) {
 		return set(source);
 	}
 	// \x98A\x8C\x8B\x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B
@@ -362,7 +356,7 @@
 	//	ch	\x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x81B
 	// \x95Ԓl:
 	//	\x91\xE3\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& operator+=(char ch) {
+	StringBuffer& operator+=(TCHAR ch) {
 		return append(ch);
 	}
 	// \x98A\x8C\x8B\x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B
@@ -371,7 +365,7 @@
 	//	source	\x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B
 	// \x95Ԓl:
 	//	\x91\xE3\x93\xFC\x8C\x8B\x89ʁB
-	StringBuffer& operator+=(const char* source) {
+	StringBuffer& operator+=(const TCHAR* source) {
 		return append(source);
 	}
 };

Modified: branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -18,7 +18,7 @@
 
 class StringUtil {
 private:
-	static int hexadecimal(char c) {
+	static int hexadecimal(TCHAR c) {
 		if ('0' <= c && c <= '9') {
 			return c - '0';
 		}else if ('A' <= c && c <= 'F') {
@@ -29,15 +29,15 @@
 			return -1;
 		}
 	}
-	static int octet(char c) {
+	static int octet(TCHAR c) {
 		return '0' <= c && c <= '7' ? c - '0' : -1;
 	}
-	static const char* ESCAPE_CHARS() {
-		static const char string[] = "abfnrtv";
+	static const TCHAR* ESCAPE_CHARS() {
+		static const TCHAR string[] = _T("abfnrtv");
 		return string;
 	}
-	static const char* CONTROL_CHARS() {
-		static const char string[] = "\a\b\f\n\r\t\v";
+	static const TCHAR* CONTROL_CHARS() {
+		static const TCHAR string[] = _T("\a\b\f\n\r\t\v");
 		return string;
 	}
 public:
@@ -60,12 +60,12 @@
 	static bool escape(StringBuffer& buffer, String string, int offset, int length) {
 		if (string == NULL)
 			return false;
-		const char* start = string;
+		const TCHAR* start = string;
 		start += offset;
-		const char* p = start;
-		const char* end = start + length;
+		const TCHAR* p = start;
+		const TCHAR* end = start + length;
 		while (p < end && *p != '\0') {
-			char ch = *p;
+			TCHAR ch = *p;
 			if ('\0' < ch && ch < ' ' || ch == '\'' || ch == '"' || ch == '?' || ch == '\\') {
 				bool useOctet;
 				if (ch < ' ') {
@@ -95,12 +95,14 @@
 				}
 				start = ++p;
 			}else{
+#if !defined(UNICODE)
 				if (String::isLeadByte(ch))
 					p++;
+#endif
 				p++;
 			}
 		}
-		if (start == (const char*) string) {
+		if (start == (const TCHAR*) string) {
 			return false;
 		}
 		buffer.append(start);
@@ -126,10 +128,10 @@
 	static bool unescape(StringBuffer& buffer, String string, int offset, int length) {
 		if (string == NULL)
 			return false;
-		const char* start = string;
+		const TCHAR* start = string;
 		start += offset;
-		const char* p = start;
-		const char* end = start + length;
+		const TCHAR* p = start;
+		const TCHAR* end = start + length;
 		while (p < end && *p != '\0') {
 			if (*p == '\\') {
 				if (p > start) {
@@ -136,7 +138,7 @@
 					buffer.append(start, p - start);
 					start = p;
 				}
-				char ch = '\0';
+				TCHAR ch = '\0';
 				switch (*++p) {
 				case '\'':
 				case '"':
@@ -188,13 +190,15 @@
 					start = p;
 				}
 			}else{
+#if !defined(UNICODE)
 				if (String::isLeadByte(*p)) {
 					p++;
 				}
+#endif
 				p++;
 			}
 		}
-		if (start == (const char*) string) {
+		if (start == (const TCHAR*) string) {
 			return false;
 		}
 		buffer.append(start);

Modified: branches/cmake/TTProxy/YCL/include/YCL/Window.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/Window.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/Window.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -10,8 +10,8 @@
 #endif // _MSC_VER >= 1000
 
 #include <YCL/common.h>
-
 #include <YCL/String.h>
+//#include "codeconv.h"
 
 namespace yebisuya {
 
@@ -39,16 +39,16 @@
 	int GetWindowTextLength()const {
 		return ::GetWindowTextLength(window);
 	}
-	int GetWindowText(char* buffer, int size)const {
+	int GetWindowText(TCHAR* buffer, int size)const {
 		return ::GetWindowText(window, buffer, size);
 	}
 	String GetWindowText()const {
 		int length = GetWindowTextLength();
-		char* buffer = (char*) alloca(length + 1);
+		TCHAR* buffer = (TCHAR*) alloca((length + 1) * sizeof(TCHAR));
 		GetWindowText(buffer, length + 1);
-		return buffer;
+		return String(buffer);
 	}
-	bool SetWindowText(const char* text) {
+	bool SetWindowText(const TCHAR* text) {
 		return ::SetWindowText(window, text) != FALSE;
 	}
 	long SendMessage(int message, int wparam = 0, long lparam = 0)const {
@@ -208,7 +208,7 @@
 		static const char USER32[] = "user32.dll";
 		static const char APINAME[] = "SetLayeredWindowAttributes";
 		static DWORD (WINAPI* api)(HWND, DWORD, BYTE, DWORD)
-			= (DWORD (WINAPI*)(HWND, DWORD, BYTE, DWORD)) ::GetProcAddress(::GetModuleHandle(USER32), APINAME);
+			= (DWORD (WINAPI*)(HWND, DWORD, BYTE, DWORD)) ::GetProcAddress(::GetModuleHandleA(USER32), APINAME);
 		return api != NULL ? (*api)(window, reserved, parameters, attribute) : 0;
 	}
 	long SetLayeredWindowAttributes(int parameters, long attribute) {
@@ -226,10 +226,10 @@
 	bool UnregisterHotKey(int id) {
 		return ::UnregisterHotKey(window, id) != FALSE;
 	}
-	int MessageBox(const char* message, const char* caption, int type) {
+	int MessageBox(const TCHAR* message, const TCHAR* caption, int type) {
 		return ::MessageBox(window, message, caption, type);
 	}
-	int MessageBox(const char* message, int type) {
+	int MessageBox(const TCHAR* message, int type) {
 		Window top(window);
 		while ((top.getStyle() & WS_CHILD) != 0) {
 			top <<= top.GetParent();
@@ -247,7 +247,7 @@
 		return create(exStyle, classname, title, style, rect, parent, menu, GetInstanceHandle(), param);
 	}
 	bool create(long exStyle, const char* classname, const char* title, long style, const RECT& rect, HWND parent, HMENU menu, HINSTANCE instance, void* param = NULL) {
-		return (window = ::CreateWindowEx(exStyle, classname, title,
+		return (window = ::CreateWindowExA(exStyle, classname, title,
 			style, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
 			parent, menu, instance, param)) != NULL;
 	}

Modified: branches/cmake/TTProxy/YCL/include/YCL/common.h
===================================================================
--- branches/cmake/TTProxy/YCL/include/YCL/common.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/TTProxy/YCL/include/YCL/common.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -38,9 +38,9 @@
 	char buffer[1025];
 	va_list arglist;
 	va_start(arglist, format);
-	wvsprintf(buffer, format, arglist);
+	wvsprintfA(buffer, format, arglist);
 	va_end(arglist);
-	OutputDebugString(buffer);
+	OutputDebugStringA(buffer);
 }
 
 #define YCLTRACE(s)                      OutputDebugString(s)
@@ -53,12 +53,12 @@
 inline bool YclAssert(bool condition, const char* message) {
 	if (!condition) {
 		char buffer[1025];
-		wsprintf(buffer, "Assertion Failed!!\n\n"
+		wsprintfA(buffer, "Assertion Failed!!\n\n"
 						 "  %s\n\n"
 						 "if ABORT button pushed then exit this program,\n"
 						 "if RETRY button pushed then enter debug mode,\n"
 						 "and if IGNORE button pushed then continue program.", message);
-		switch (MessageBox(NULL, buffer, "YEBISUYA Class Library", MB_ABORTRETRYIGNORE | MB_ICONWARNING)) {
+		switch (MessageBoxA(NULL, buffer, "YEBISUYA Class Library", MB_ABORTRETRYIGNORE | MB_ICONWARNING)) {
 		case IDABORT:
 			ExitProcess(-1);
 			break;

Modified: branches/cmake/teraterm/common/codeconv.cpp
===================================================================
--- branches/cmake/teraterm/common/codeconv.cpp	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/teraterm/common/codeconv.cpp	2018-12-14 15:41:26 UTC (rev 7327)
@@ -148,3 +148,271 @@
 	return strU8;
 }
 
+//////////////////////////////////////////////////////////////////////////////
+
+u8::u8()
+{
+	u8str_ = NULL;
+}
+
+u8::u8(const char *astr)
+{
+	u8str_ = NULL;
+	assign(astr, CP_ACP);
+}
+
+u8::u8(const char *astr, int cpage)
+{
+	u8str_ = NULL;
+	assign(astr, cpage);
+}
+
+u8::u8(const wchar_t *wstr)
+{
+	u8str_ = NULL;
+	assign(wstr);
+}
+
+u8::u8(const u8 &obj)
+{
+	copy(obj);
+}
+
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+u8::u8(u8 &&obj) noexcept
+{
+	move(obj);
+}
+#endif
+
+u8::~u8()
+{
+	if (u8str_ != NULL) {
+		free(u8str_);
+		u8str_ = NULL;
+	}
+}
+
+u8& u8::operator=(const char *astr)
+{
+	assign(astr, CP_ACP);
+	return *this;
+}
+
+u8& u8::operator=(const wchar_t *wstr)
+{
+	assign(wstr);
+	return *this;
+}
+
+u8& u8::operator=(const u8 &obj)
+{
+	copy(obj);
+	return *this;
+}
+
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+u8& u8::operator=(u8 &&obj) noexcept
+{
+	move(obj);
+	return *this;
+}
+#endif
+
+u8::operator const char *() const
+{
+	return cstr();
+}
+
+const char *u8::cstr() const
+{
+	if (u8str_ == NULL) {
+		return "";
+	}
+	return u8str_;
+}
+
+void u8::assign(const char *astr, int code_page)
+{
+	if (u8str_ != NULL) {
+		free(u8str_);
+	}
+	wchar_t *wstr = _MultiByteToWideChar(astr, 0, code_page, NULL);
+	if (wstr != NULL) {
+		assign(wstr);
+		free(wstr);
+	} else {
+		u8str_ = NULL;
+	}
+}
+
+void u8::assign(const wchar_t *wstr)
+{
+	if (u8str_ != NULL) {
+		free(u8str_);
+	}
+	char *u8str = _WideCharToMultiByte(wstr, 0, CP_UTF8, NULL);
+	if (u8str != NULL) {
+		u8str_ = u8str;
+	} else {
+		u8str_ = NULL;
+	}
+}
+
+void u8::copy(const u8 &obj)
+{
+	if (u8str_ != NULL) {
+		free(u8str_);
+	}
+	u8str_ = _strdup(obj.u8str_);
+}
+
+void u8::move(u8 &obj)
+{
+	if (this != &obj) {
+		if (u8str_ != NULL) {
+			free(u8str_);
+		}
+		u8str_ = obj.u8str_;
+		obj.u8str_ = NULL;
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+tc::tc()
+{
+	tstr_ = NULL;
+}
+
+tc::tc(const char *astr)
+{
+	tstr_ = NULL;
+	assign(astr, CP_ACP);
+}
+
+tc::tc(const char *astr, int code_page)
+{
+	tstr_ = NULL;
+	assign(astr, code_page);
+}
+
+tc::tc(const wchar_t *wstr)
+{
+	tstr_ = NULL;
+	assign(wstr, CP_ACP);
+}
+
+tc::tc(const wchar_t *wstr, int code_page)
+{
+	tstr_ = NULL;
+	assign(wstr, code_page);
+}
+
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+tc::tc(tc &&obj) noexcept
+{
+	move(obj);
+}
+#endif
+
+tc::~tc()
+{
+	if (tstr_ != NULL) {
+		free(tstr_);
+	}
+}
+
+tc& tc::operator=(const char *astr)
+{
+	assign(astr, CP_ACP);
+	return *this;
+}
+
+tc& tc::operator=(const wchar_t *wstr)
+{
+	assign(wstr, CP_ACP);
+	return *this;
+}
+
+const TCHAR *tc::fromUtf8(const char *u8str)
+{
+	if (tstr_ != NULL) {
+		free(tstr_);
+	}
+	tstr_ = NULL;
+	wchar_t *wstr = _MultiByteToWideChar(u8str, 0, CP_UTF8, NULL);
+	if (wstr != NULL) {
+		assign(wstr, CP_ACP);
+		free(wstr);
+	}
+	return cstr();
+}
+
+tc::operator const TCHAR *() const
+{
+	return cstr();
+}
+
+const TCHAR *tc::cstr() const
+{
+	if (tstr_ == NULL) {
+		return _T("");
+	}
+	return tstr_;
+}
+
+void tc::assign(const char *astr, int code_page)
+{
+	if (tstr_ != NULL) {
+		free(tstr_);
+	}
+#if !defined(UNICODE)
+	(void)code_page;
+	tstr_ = _strdup(astr);
+#else
+	wchar_t *wstr = _MultiByteToWideChar(astr, 0, code_page, NULL);
+	if (wstr != NULL) {
+		tstr_ = wstr;
+	} else {
+		tstr_ = NULL;
+	}
+#endif
+}
+
+void tc::assign(const wchar_t *wstr, int code_page)
+{
+	if (tstr_ != NULL) {
+		free(tstr_);
+	}
+#if defined(UNICODE)
+	(void)code_page;
+	tstr_ = _wcsdup(wstr);
+#else
+	char *astr = _WideCharToMultiByte(wstr, 0, code_page, NULL);
+	if (astr != NULL) {
+		tstr_ = astr;
+	} else {
+		tstr_ = NULL;
+	}
+#endif
+}
+
+void tc::copy(const tc &obj)
+{
+	if (tstr_ != NULL) {
+		free(tstr_);
+	}
+	tstr_ = _tcsdup(obj.tstr_);
+}
+
+void tc::move(tc &obj)
+{
+	if (this != &obj) {
+		if (tstr_ != NULL) {
+			free(tstr_);
+		}
+		tstr_ = obj.tstr_;
+		obj.tstr_ = NULL;
+	}
+}

Modified: branches/cmake/teraterm/common/codeconv.h
===================================================================
--- branches/cmake/teraterm/common/codeconv.h	2018-12-14 15:41:11 UTC (rev 7326)
+++ branches/cmake/teraterm/common/codeconv.h	2018-12-14 15:41:26 UTC (rev 7327)
@@ -1,4 +1,6 @@
 
+#pragma once
+
 #include <tchar.h>
 
 #ifdef __cplusplus
@@ -33,3 +35,70 @@
 TCHAR *ToTchar(const wchar_t *strW);
 #endif
 
+
+#ifdef __cplusplus
+
+#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1910))
+#define	MOVE_CONSTRUCTOR_ENABLE
+#endif
+
+class u8
+{
+public:
+	u8();
+	u8(const char *astr);
+	u8(const char *astr, int code_page);
+	u8(const wchar_t *wstr);
+	u8(const u8 &obj);
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+	u8(u8 &&obj) noexcept;
+#endif
+	~u8();
+	u8& operator=(const char *astr);
+	u8& operator=(const wchar_t *wstr);
+	u8& operator=(const u8 &obj);
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+	u8& operator=(u8 &&obj) noexcept;
+#endif
+	operator const char *() const;
+	const char *cstr() const;
+private:
+	char *u8str_;
+	void assign(const char *astr, int code_page);
+	void assign(const wchar_t *wstr);
+	void copy(const u8 &obj);
+	void move(u8 &obj);
+};
+
+class tc
+{
+public:
+	tc();
+	tc(const char *astr);
+	tc(const char *astr, int code_page);
+	tc(const wchar_t *wstr);
+	tc(const wchar_t *wstr, int code_page);
+	tc(const tc &obj);
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+	tc(tc &&obj) noexcept;
+#endif
+	~tc();
+	tc& operator=(const char *astr);
+	tc& operator=(const wchar_t *wstr);
+	tc& operator=(const tc &obj);
+#if defined(MOVE_CONSTRUCTOR_ENABLE)
+	tc& operator=(tc &&obj) noexcept;
+#endif
+	const TCHAR *fromUtf8(const char *u8str);
+	operator const TCHAR *() const;
+	const TCHAR *cstr() const;
+private:
+	TCHAR *tstr_;
+	void assign(const char *astr, int code_page);
+	void assign(const wchar_t *astr, int code_page);
+	void copy(const tc &obj);
+	void move(tc &obj);
+};
+#endif
+
+


Ttssh2-commit メーリングリストの案内
Back to archive index