主页SDK 开发库C++ Builder 里面使用 JsonCpp 和 JsonCpp 支持 UNICODE (UTF-16) / UTF-8 的方法
Victor 串口控件
 • 最新版本 (VCL/FMX)
 • 常见问题及解决方法
 • 以往版本串口控件
控件安装方法
 • XE6 ~ C10 (CX)
 • XE2 ~ XE5
 • 2007/2009/2010/XE
 • BCB5, BCB6
使用简介
串口控件详细说明
串口调试工具
C++ Builder 资料
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
C++ Builder 资源
控件
SDK 开发库
源码
软件发布
更新动态
网站更新记录
网友留言/技术支持

 

C++ Builder 里面使用 JsonCpp 和 JsonCpp 支持 UNICODE (UTF-16) / UTF-8 的方法
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Victor Chen
http://www.cppfans.com/
2013-12-16

这是第三方 jsoncpp 库的使用C++ Builder 自带的 JSON 在这里

JsonCpp 是一个比较著名的JSON (JavaScript Object Notation) 开发库,官方网站:http://jsoncpp.sourceforge.net/ ,JsonCpp 的最新版本 0.5.0,官方下载地址:http://sourceforge.net/projects/jsoncpp/files/ 。

官方版本只提供了 Visual C++ 的编译和使用方法,C++ Builder 编译会报语法错误,经过测试,发现做如下改动,可以在 C++ Builder 里面编译通过:

① include\json\value.h 第 886 行开始位置的 ValueIteratorBase 类的几个构造函数移动到这个类的后面,移动之后的位置在第 938 行开始的位置,只是把位置移动到这里,没有修改代码内容。构造函数写在前面就编译不通过,写在后面就能编译通过,至于为什么,还没研究明白,因为任何地方的语法都根本就没有错误。

② src\lib_json\json_reader.cpp 第 9 行:添加一行 #include <stdio.h> 。也许是 VC 会在项目里面默认就包含这个头文件,BCB 需要在代码里面添加包含 stdio.h 才能调用里面的函数。

使用方法:

第一种方法:先生成 .lib 库文件,应用程序链接这个库文件。
编译、生成 .lib 库文件的方法:创建一个生成静态库的项目,只需要把 jsoncpp-src-0.5.0\src\lib_json 文件夹里面的 3 个 .cpp 文件:
json_reader.cpp
json_value.cpp
json_writer.cpp

加入进来,编译,生成的 .lib 文件就可以使用了。


第二种方法:直接把 jsoncpp-src-0.5.0\src\lib_json 文件夹里面的 3 个 .cpp 文件:
json_reader.cpp
json_value.cpp
json_writer.cpp

加入应用程序项目文件。

本站提供修改之后的开发库下载,下载链接在本页面的最后。

下面主要是介绍 UNICODE 支持。

C++ Builder 2009 之后支持 UNICODE,之前版本,比如 BCB 6.0 不支持 UNICODE。
C++ Builder 2009 之后的版本,可以用 UTF8String 来让 JsonCpp 开发库支持 UNICODE。
早期版本的 BCB 不支持 UNICODE,只能用 AnsiString 代替后面文章的 UTF8String,当然,程序也就不支持 UNICODE 了,所有的处理都是 ANSI 编码了。

以下关于 UNICODE 的支持,适用于 C++ Builder 2009 之后的版本。
UNICODE 字符串转换的规律:std::string <= 用.c_str() => UTF8String <= 直接赋值 => UnicodeString 或 L"字符串" - http://www.cppfans.com/
UTF8String 可以和 UnicodeString 之间相互赋值,因为他们都是 UNICODE,只是编码方式不同,一个是 UTF-8,另一个是 UTF-16。
UTF8String 可以和 std::string 之间,用 .c_str() 转换为另一个,而 UnicodeString 和 std::string 之间转换,必须中间经过 UTF8String。
例如:

UTF8String u8 = L"UNICODE字符串"; // 引号前面加 L 表示使用 UNICODE
UnicodeString u16 = L"UNICODE字符串"; // 引号前面加 L 表示使用 UNICODE
std::string ss; // 不要直接给 std::string 赋值,因为这个类型不能直接支持 UNICODE,需要用 UTF-8

u8=u16; // UTF-8 和 UNICODE (UTF-16) 之间可以直接赋值
ss=u8.c_str(); // 用 UTF8String 的 .c_str() 转成 std::string
// http://www.cppfans.com/
u8=ss.c_str(); // 用 std::string 的 .c_str() 转成 UTF8String
u16=u8; // UNICODE (UTF-16) 和 UTF-8 之间可以直接赋值

掌握了这个规律,就可以让 JsonCpp 支持 UNICODE。

Json::Value root;

root["name"] = "Mr. Chen"; // 英文的 UTF-8 编码和 ANSI 编码相同,这样写没有问题
root[UTF8String(L"姓名").c_str()] = UTF8String(L"陈先生").c_str(); // 汉字必须说明 UTF-8

UTF8String name = root["name"].asCString(); // asCString() 可直接转成 UTF8String
UTF8String 姓名 = root[UTF8String(L"姓名").c_str()].asCString();
// http://www.cppfans.com/
Memo2->Lines->Add(L"name: " + name); // UTF-8 也是 UNICODE,这样写没问题
Memo2->Lines->Add(L"姓名: " + 姓名); // UTF-8 也是 UNICODE,这样写没问题

解析和读取数据:

void __fastcall TFormTestJson::ButtonGetValueClick(TObject *Sender)
{
   UTF8String txt = Memo1->Text; // 使用 UTF8String 来支持 UNICODE
   Json::Reader reader;
   Json::Value root;
   if(!reader.parse(txt.c_str(),root)) // 需要用.c_str()转换 - http://www.cppfans.com/
   {
       Memo2->Lines->Add(L"结构错误");
       return;
   }

  Memo2->Lines->Clear();
  UTF8String s = root["strval"].asCString(); // asCString() 可直接给 UTF8String 赋值
  Memo2->Lines->Add(L"strval="+s); // UNICODE / UTF8 是支持世界各国语言的

  UTF8String key = L"整数值";
  s = root[key.c_str()].asCString();
  Memo2->Lines->Add(L"整数值="+s);

  int n = root["arrval"].size();
  for(int i=0; i<n; i++)
  {
     s = root["arrval"][i].asCString();
     Memo2->Lines->Add(L"arrval的第"+String(i)+L"个数是"+s);
  }
}

生成 Json 文件:

void __fastcall TFormTestJson::ButtonSaveFileClick(TObject *Sender)
{
  Json::Value root;
  UTF8String key, val; // 使用 UTF8String 来支持 UNICODE

  key = L"name";
  val = L"JSON测试程序, 支持UNICODE哦";
  root[key.c_str()] = val.c_str();

  key = L"desc";
  val = L"Copyright © Victor Chen, http://www.cppfans.com/";
  root[key.c_str()] = val.c_str();

  key = L"字符串值";
  val = L"中文한국어Tiếng Việt"; // UNICODE / UTF-8 支持世界各国语言混合文本
  root[key.c_str()] = val.c_str();

  UTF8String txt = root.toStyledString().c_str();
  Memo2->Text = txt;

  UnicodeString fname = ExtractFilePath(Application->ExeName)+L"Test.txt";
  int hFile = FileCreate(fname);
  if(hFile>=0)
  {
    if(RadioButtonUNICODE->Checked)
    {
      Memo2->Lines->Add(L"生成UNICODE文件");
      UnicodeString us = txt;
      FileWrite(hFile,"\xFF\xFE",2); // UNICODE
      FileWrite(hFile,us.c_str(),us.Length()*sizeof(wchar_t));
    }
    else
    {
      Memo2->Lines->Add(L"生成UTF8文件");
      FileWrite(hFile,"\xEF\xBB\xBF",3); // UTF8
      FileWrite(hFile,txt.c_str(),txt.Length());
    }
    FileClose(hFile);
    Memo2->Lines->Add(L"已经保存到UTF8文件: "+fname);
  }
}

其他内容可以下载演示程序查看。

下载的文件内容:

① 修改之后的 JsonCpp 开发库 jsoncpp-src-0.5.0 ,在开发库 jsoncpp-src-0.5.0 文件夹里面新增加了一个 makefiles\bcb2010 文件夹,里面是 C++ Builder 2010 静态库项目文件,用 C++ Builder 2010 打开编译,可以生成 lib\bcb\jsoncpp.lib 文件。其他版本的 C++ Builder 可以按照前面的使用方法自己创建一个静态库。

② C++ Builder 2010 演示程序,在 testJSON 文件夹里面,是一个完整的 C++ Builder 2010 项目,包含解析、生成、读文件、写文件等。

演示程序支持 UNICODE / UTF8,可按需要生成 UTF8 或 UNICODE (UTF16) 文件,读取文件可自动识别 UTF8 / UNICODE (UTF16) / ANSI 文件,完美支持世界各国语言混合文字内容,当然也包括中文。
 


下载 JsonCpp for C++ Builder,包含源码、演示程序 676,420 字节 (下载 2053 次) (2013-12-16)

C++ Builder 自带的 JSON 解析和生成


C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号