Przeglądaj źródła

[bugfix][Fix #28] refactored unicode parsing

B Thibault 9 lat temu
rodzic
commit
ae46a7752f
3 zmienionych plików z 8 dodań i 8 usunięć
  1. 5 5
      src/streamConsumer.cpp
  2. 1 1
      test/src/unicode.cpp
  3. 2 2
      test/testUnicode.json

+ 5 - 5
src/streamConsumer.cpp

@@ -6,6 +6,8 @@
 
 #include <iostream>
 #include <sstream>
+#include <codecvt>
+#include <locale>
 #include "jsonElement.hh"
 #include "streamConsumer.hh"
 #include "unicode.hpp"
@@ -339,11 +341,9 @@ JSonElement *StreamConsumer::consumeToken(JSonContainer *parent, std::stringstre
 void StreamConsumer::appendUnicode(const char unicode[4], std::stringstream &buf)
 {
     unsigned short uni = hexbyte<unsigned short>(unicode, 4);
-    char test[5];
-
-    bzero(test, sizeof(*test) *5);
-    snprintf(test, 4, "%lc", uni);
-    buf.write(test, 2);
+    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter;
+    std::string unichar = converter.to_bytes(uni);
+    buf.write(unichar.c_str(), unichar.size());
 }
 
 std::string StreamConsumer::extractUnicode(const char *buf)

+ 1 - 1
test/src/unicode.cpp

@@ -19,7 +19,7 @@ class StreamConsumerTester: public StreamConsumer
         {
             std::string s = getStringFromUnicode("00e8");
             if (s != "è")
-                FAILED(s, "!=", "è");
+                FAILED((int)(s.c_str()[0]), "!=", (int)L'è');
             return true;
         };
 };

+ 2 - 2
test/testUnicode.json

@@ -1,9 +1,9 @@
 [
-    "_\u20ac_\u20ac_",
+    "_\u20ac_\u20ac_ is _euro_euro_",
     "Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa",
     "В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!",
     "ascii-only",
-    "\u058e",
+    "\u058e is 'LEFT-FACING ARMENIAN ETERNITY SIGN'",
     {
         "eurooooooooooooooooooooooooooo": "\u20ac coucou"
     }