From 177dfc6384b926dd19e3b7e98a995ccb4da9167c Mon Sep 17 00:00:00 2001 From: mano-wii Date: Fri, 22 Nov 2019 12:26:54 -0300 Subject: Fix T71273: Bad encoding of utf-8 for Text objects `BLI_strncpy_wchar_from_utf8` internally assumes `wchar_t` is 32 bits which is not the case on windows. The solution is to replace `wchar_t` with `char32_t`. Thanks to @robbott for compatibility on macOS. Differential Revision: https://developer.blender.org/D6198 --- source/blender/blenlib/BLI_string_utf8.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'source/blender/blenlib/BLI_string_utf8.h') diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h index 0cdd6e94610..1db4cdfecd6 100644 --- a/source/blender/blenlib/BLI_string_utf8.h +++ b/source/blender/blenlib/BLI_string_utf8.h @@ -26,6 +26,7 @@ extern "C" { #endif #include "BLI_compiler_attrs.h" +#include "BLI_sys_types.h" char *BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL(); @@ -48,6 +49,13 @@ unsigned int BLI_str_utf8_as_unicode_and_size_safe(const char *__restrict p, unsigned int BLI_str_utf8_as_unicode_step(const char *__restrict p, size_t *__restrict index) ATTR_NONNULL(); size_t BLI_str_utf8_from_unicode(unsigned int c, char *outbuf); +size_t BLI_str_utf8_as_utf32(char32_t *__restrict dst_w, + const char *__restrict src_c, + const size_t maxncpy) ATTR_NONNULL(); +size_t BLI_str_utf32_as_utf8(char *__restrict dst, + const char32_t *__restrict src, + const size_t maxncpy) ATTR_NONNULL(); +size_t BLI_str_utf32_as_utf8_len(const char32_t *src) ATTR_NONNULL(); char *BLI_str_find_prev_char_utf8(const char *str, const char *p) ATTR_NONNULL(); char *BLI_str_find_next_char_utf8(const char *p, const char *end) ATTR_NONNULL(1); @@ -68,8 +76,8 @@ size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst, const size_t maxcpy) ATTR_NONNULL(); /* count columns that character/string occupies, based on wcwidth.c */ -int BLI_wcwidth(wchar_t ucs); -int BLI_wcswidth(const wchar_t *pwcs, size_t n) ATTR_NONNULL(); +int BLI_wcwidth(char32_t ucs); +int BLI_wcswidth(const char32_t *pwcs, size_t n) ATTR_NONNULL(); /* warning, can return -1 on bad chars */ int BLI_str_utf8_char_width(const char *p) ATTR_NONNULL(); int BLI_str_utf8_char_width_safe(const char *p) ATTR_NONNULL(); -- cgit v1.2.3