diff -ruN scim-1.4.4.org/src/scim_iconv.cpp scim-1.4.4/src/scim_iconv.cpp --- scim-1.4.4.org/src/scim_iconv.cpp 2005-08-15 21:45:46.000000000 +0900 +++ scim-1.4.4/src/scim_iconv.cpp 2006-12-10 10:39:17.360221573 +0900 @@ -96,11 +96,11 @@ iconv_t new_iconv_to_unicode; if (scim_is_little_endian ()) { - new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-4LE"); - new_iconv_to_unicode = iconv_open ("UCS-4LE", encoding.c_str ()); + new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-2LE"); + new_iconv_to_unicode = iconv_open ("UCS-2LE", encoding.c_str ()); } else { - new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-4BE"); - new_iconv_to_unicode = iconv_open ("UCS-4BE", encoding.c_str ()); + new_iconv_from_unicode = iconv_open (encoding.c_str (), "UCS-2BE"); + new_iconv_to_unicode = iconv_open ("UCS-2BE", encoding.c_str ()); } if (new_iconv_from_unicode == (iconv_t) -1 || @@ -143,17 +143,23 @@ size_t src_buf_size = 0; size_t ret; + ucs2_t *ucs2src = new ucs2_t[src_len]; + for (int i = 0; i < src_len; i++) { + ucs2src[i] = (ucs2_t)src[i]; + } + iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size); char *dest_buf_ptr = dest_buf; - ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src; + ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) ucs2src; dest_buf_size = SCIM_MAX_BUFSIZE * MB_LEN_MAX; - src_buf_size = src_len * sizeof (ucs4_t); + src_buf_size = src_len * sizeof (ucs2_t); ret = iconv (m_impl->m_iconv_from_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); dest.assign (dest_buf, dest_buf_ptr); + delete[] ucs2src; return ret != (size_t) -1; } @@ -171,18 +177,24 @@ char dest_buf [SCIM_MAX_BUFSIZE * MB_LEN_MAX]; size_t src_buf_size = 0; size_t dest_buf_size = 0; + size_t ret; + ucs2_t *ucs2src = new ucs2_t[src_len]; + for (int i = 0; i < src_len; i++) { + ucs2src[i] = (ucs2_t)src[i]; + } iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size); char *dest_buf_ptr = dest_buf; - ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src; + ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) ucs2src; - src_buf_size = src_len * sizeof (ucs4_t); + src_buf_size = src_len * sizeof (ucs2_t); dest_buf_size = SCIM_MAX_BUFSIZE * MB_LEN_MAX; ret = iconv (m_impl->m_iconv_from_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); + delete[] ucs2src; return ret != (size_t) -1; } @@ -198,20 +210,30 @@ if (m_impl->m_iconv_to_unicode == (iconv_t) -1) return false; ucs4_t dest_buf [SCIM_MAX_BUFSIZE]; + ucs2_t ucs2_dest_buf [SCIM_MAX_BUFSIZE]; size_t dest_buf_size = 0; size_t src_buf_size = 0; size_t ret; + int i; iconv (m_impl->m_iconv_to_unicode, 0, &src_buf_size, 0, &dest_buf_size); - char *dest_buf_ptr = (char*) dest_buf; + char *dest_buf_ptr = (char*) ucs2_dest_buf; ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src; - dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs4_t); + dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs2_t); src_buf_size = src_len; ret = iconv (m_impl->m_iconv_to_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); + + size_t dest_cnt = (SCIM_MAX_BUFSIZE * sizeof (ucs2_t) - dest_buf_size) + / sizeof (ucs2_t); + + for (i = 0; i < dest_cnt; i++) { + dest_buf[i] = (ucs4_t)ucs2_dest_buf[i] & 0x0000ffff; + } + dest_buf_ptr = (char *)&dest_buf[i]; dest.assign (dest_buf, (ucs4_t*) dest_buf_ptr); return ret != (size_t) -1; @@ -234,16 +256,21 @@ size_t dest_buf_size = 0; size_t ret; - iconv (m_impl->m_iconv_from_unicode, 0, &src_buf_size, 0, &dest_buf_size); + ucs2_t *ucs2src = new ucs2_t[src_len]; + for (int i = 0; i < src_len; i++) { + ucs2src[i] = (ucs2_t)src[i]; + } + iconv (m_impl->m_iconv_to_unicode, 0, &src_buf_size, 0, &dest_buf_size); char *dest_buf_ptr = (char*) dest_buf; - ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) src; + ICONV_CONST char *src_buf_ptr = (ICONV_CONST char*) ucs2src; src_buf_size = src_len; - dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs4_t); + dest_buf_size = SCIM_MAX_BUFSIZE * sizeof (ucs2_t); ret = iconv (m_impl->m_iconv_to_unicode, &src_buf_ptr, &src_buf_size, &dest_buf_ptr, &dest_buf_size); + delete[] ucs2src; return ret != (size_t) -1; } diff -ruN scim-1.4.4.org/src/scim_types.h.in scim-1.4.4/src/scim_types.h.in --- scim-1.4.4.org/src/scim_types.h.in 2005-01-05 22:41:10.000000000 +0900 +++ scim-1.4.4/src/scim_types.h.in 2006-12-10 10:39:17.358667879 +0900 @@ -43,6 +43,7 @@ #else typedef uint32 ucs4_t; #endif +typedef uint16 ucs2_t; typedef std::basic_string String; typedef std::basic_string WideString;