You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Hatem Helal (JIRA)" <ji...@apache.org> on 2014/10/10 12:38:33 UTC

[jira] [Commented] (AVRO-1593) C++ json encoder assumes "C" locale and generates invalid UTF-8 sequence

    [ https://issues.apache.org/jira/browse/AVRO-1593?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14166625#comment-14166625 ] 

Hatem Helal commented on AVRO-1593:
-----------------------------------

JsonGenerator::doEncodeString relies on calling "iscntrl" to determine whether a given byte is a control character.  In the windows-1252 code page the byte "\x81" is a control character but not in the C locale which breaks the UTF-8 byte sequence.  

A workaround is to temporarily set the LC_CTYPE locale to "C", do the json encoding, and then reset the LC_CTYPE back to its previous value but modifying the global locale settings isn't thread safe.  A better approach would be to use the newer "std::iscntrl" function which accepts a locale object.  A patch is available here:

http://git.io/XetN-w

> C++ json encoder assumes "C" locale and generates invalid UTF-8 sequence 
> -------------------------------------------------------------------------
>
>                 Key: AVRO-1593
>                 URL: https://issues.apache.org/jira/browse/AVRO-1593
>             Project: Avro
>          Issue Type: Bug
>          Components: c++
>         Environment: windows-1252 encoding
>            Reporter: Hatem Helal
>            Priority: Critical
>
> encoding a multibyte UTF-8 code point such as:
> "\xEF\xBD\x81"
> Incorrectly becomes:
> "\xEF\xBD\U0081"
> When encoded in the service running in the windows-1252 locale.  This isnĀ¹t a valid UTF-8 sequence so we end up with Mojibake when reading back the JSON encoded string.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)