You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Simon Falsig (JIRA)" <ji...@apache.org> on 2014/12/02 16:03:12 UTC

[jira] [Updated] (THRIFT-2870) C++ TJSONProtocol using locale dependent formatting

     [ https://issues.apache.org/jira/browse/THRIFT-2870?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Simon Falsig updated THRIFT-2870:
---------------------------------
    Attachment: use-classic-locale-for-cpp-json_4.patch

I've tried putting together a quick patch (against my own Thrift 0.9.0), where I've exchanged the boost::lexical_cast with an ostringstream with an imbued locale. However, I'm in no way sure if my solution covers all corner cases, and I haven't done any performance testing either - but a quick initial test shows that it works on my setup, independent of the currently selected global locale.

> C++ TJSONProtocol using locale dependent formatting
> ---------------------------------------------------
>
>                 Key: THRIFT-2870
>                 URL: https://issues.apache.org/jira/browse/THRIFT-2870
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.9
>         Environment: Linux, Boost 1.51
>            Reporter: Simon Falsig
>         Attachments: use-classic-locale-for-cpp-json_4.patch
>
>
> I'm using Thrift for serializing objects (in C++) into JSON strings, which I then store as files. This usually works fine, but if the locale of my system is set to a locale where the decimal separator is ',' instead of '.' (for instance in Denmark), then the TJSONProtocol (specifically the writeJSONDouble function that does the double to string conversion through a boost::lexical_cast) will also use this separator when serializing doubles. 
> This kinda plays havoc with the JSON specification, which does not allow for localized formatting, and depends on always using '.' as a decimal separator. I could imagine that there may be other more subtle places where the local can have an effect, but this is currently the only place I've been having trouble with.
> I can see that the same problem has been fixed for C# (commit
> 3da317bda100130b2f615034c46b0944888f0f14 / THRIFT-1245 C# JSON Protocol uses culture-dependant decimal separator for double) but it doesn't seem as if there's a similarly easy way to fix boost::lexical_cast...
> Note that I'm using Thrift 0.9.0, but as far as I can see there hasn't been any relevant changes to TJSONProtocol.cpp since.
> Relevant thread on thrift-user mailing list can be found here: http://mail-archives.apache.org/mod_mbox/thrift-user/201412.mbox/%3c7c2463f510dbb7548b4718e202ac1e45@mail.gmail.com%3e



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