Cpp Cross Platform Encoding Build Status
1/2
#include "encoding/encoding.h" // using for raw convert, using bytes
#include "encoding/encoding_std.h" // using for stl strings, std::string, std::wstring, std::u16string
#include "encoding/u16string_bytes.h"// using for lower than c++11, that not have std::u16string
2/2
add in CMakeLists.txt
if (NOT TARGET encoding)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../cpp_cross_platform_encoding build_encoding)
endif ()
target_link_libraries(${BINARY_NAME} encoding)
// c language's helper function static int utf8_2_utf16le_windows(const char *src, size_t src_size, wchar_t *dst, size_t *dst_size) { int r = MultiByteToWideChar(CP_UTF8, 0, src, (int)(src_size), dst, (int)(*dst_size)); if (r <= 0) { return -1; } else { *dst_size = (size_t)(r); return 0; } } static int utf8_2_utf16le_windows2(const char * src, size_t src_size, wchar_t ** out_dst, size_t * out_dst_size) { int ret; wchar_t * dst = 0; size_t dst_size = 0; size_t rsize=0; ret = utf8_2_utf16le_windows(src, src_size, 0, &dst_size); if (0 == ret && dst_size < 0x10000) { // remember to call free() dst_size += 1; dst = (wchar_t *)calloc(1, sizeof(wchar_t)*dst_size); if (!dst) return -ENOMEM; rsize = dst_size; utf8_2_utf16le_windows(src, src_size, dst, &rsize); if(rsize>=dst_size) { free(dst); return -1; } *out_dst = dst; dst[rsize]=0; *out_dst_size = rsize; return 0; } return -1; } static int utf16le_2_utf8_windows(const wchar_t *src, size_t src_size, char *dst, size_t *dst_size) { int r = WideCharToMultiByte(CP_UTF8, 0, src, (int)(src_size), dst, (int)(*dst_size), NULL, NULL); if (r <= 0) { return -1; } else { *dst_size = (size_t)(r); return 0; } } static int utf16le_2_utf8_windows2(const wchar_t *src, size_t src_size, char ** out_dst, size_t * out_dst_size) { int ret; char * dst = 0; size_t dst_size = 0; size_t rsize=0; ret = utf16le_2_utf8_windows(src, src_size, 0, &dst_size); if (0 == ret && dst_size<0x10000) { // remember to call free() dst_size += 1; dst = (char *)calloc(1, dst_size); if (!dst) return -ENOMEM; rsize=dst_size; utf16le_2_utf8_windows(src, src_size, dst, &rsize); if(rsize>=dst_size) { free(dst); return -1; } *out_dst = dst; dst[rsize]=0; *out_dst_size = rsize; return 0; } return -1; }
[UTF-8 遍地开花] http://utf8everywhere.org/zh-cn