* @param utf8_str ÊÑ´¹¤¹¤ëUTF-8¤Îʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
* @param sys_str_buffer ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
* @param sys_str_buflen ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎŤµ
- * @return ¤Ê¤·
+ * @return ÊÑ´¹¤ËÀ®¸ù¤·¤¿¾ì¹çTRUE¡¢¼ºÇÔ¤·¤¿¾ì¹çFALSE¤òÊÖ¤¹
*/
#ifdef SJIS
#ifdef WINDOWS
#include <Windows.h>
-static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
+static bool utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
{
LPWSTR utf16buf;
- int input_str_len = strlen(utf8_str);
- int len;
+ int input_len = strlen(utf8_str) + 1; /* include termination character */
- C_MAKE(utf16buf, input_str_len, WCHAR);
+ C_MAKE(utf16buf, input_len, WCHAR);
- MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8_str, input_str_len, (LPWSTR)utf16buf, input_str_len);
+ /* UTF-8 -> UTF-16 */
+ if (MultiByteToWideChar( CP_UTF8, 0, utf8_str, input_len, utf16buf, input_len) == 0) {
+ C_KILL(utf16buf, input_len, WCHAR);
+ return FALSE;
+ }
- len = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)utf16buf, -1, (LPSTR)sys_str_buffer, sys_str_buflen, NULL, NULL );
-
- sys_str_buffer[len] = '\0';
+ /* UTF-8 -> SJIS(CP932) */
+ if (WideCharToMultiByte( CP_ACP, 0, utf16buf, -1, sys_str_buffer, sys_str_buflen, NULL, NULL ) == 0) {
+ C_KILL(utf16buf, input_len, WCHAR);
+ return FALSE;
+ }
- C_KILL(utf16buf, input_str_len, WCHAR);
+ C_KILL(utf16buf, input_len, WCHAR);
+ return TRUE;
}
#endif
#endif
* @brief ¼õ¤±¼è¤Ã¤¿Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤ò¿äÄꤷ¡¢¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ØÊÑ´¹¤¹¤ë
* @param strbuf ÊÑ´¹¤¹¤ëʸ»úÎó¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿¡£
* ¥Ð¥Ã¥Õ¥¡¤ÏÊÑ´¹¤·¤¿Ê¸»úÎó¤Ç¾å½ñ¤¤µ¤ì¤ë¡£
+ * UTF-8¤«¤éSJIS¤â¤·¤¯¤ÏEUC¤Ø¤ÎÊÑ´¹¤òÁÛÄꤷ¤Æ¤¤¤ë¤Î¤Ç¥Ð¥Ã¥Õ¥¡¤ÎŤµ¤¬Â¤ê¤Ê¤¯¤Ê¤ë¤³¤È¤Ï¤Ê¤¤¡£
* @param buflen ¥Ð¥Ã¥Õ¥¡¤ÎŤµ¡£
* @return ¤Ê¤·
*/
if (is_utf8_str(strbuf)) {
char* work;
C_MAKE(work, buflen, char);
- strncpy(work, strbuf, buflen);
- utf8_to_sys(work, strbuf, buflen);
+ my_strcpy(work, strbuf, buflen);
+ if (!utf8_to_sys(work, strbuf, buflen)) {
+ msg_print("·Ù¹ð:ʸ»ú¥³¡¼¥É¤ÎÊÑ´¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿");
+ msg_print(NULL);
+ }
C_KILL(work, buflen, char);
}
}