- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在将使用 Xerces-c 进行 XML 处理的代码库从 Windows/VC++ 移植到 Linux/G++。
在 Windows 上,Xerces-c 使用 wchar_t
作为字符类型 XmlCh
。这允许人们使用 std::wstring
和 L""
语法的字符串文字。
在 Linux/G++ 上,wchar_t
是 32 位的,Xerces-c 使用 unsigned short int
(16 位)作为字符类型 XmlCh
.
我已经沿着这条轨道开始了:
#ifdef _MSC_VER
using u16char_t = wchar_t;
using u16string_t = std::wstring;
#elif defined __linux
using u16char_t = char16_t;
using u16string_t = std::u16string;
#endif
不幸的是,char16_t
和unsigned short int
并不等价,它们的指针不可隐式转换。因此,将 u"Hello, world."
传递给 Xerces 函数仍然会导致无效转换错误。
开始看起来我必须显式转换传递给 Xerces 函数的每个字符串。但在我这样做之前,我想问问是否有人知道编写跨平台 Xerces-c 代码的更明智的方法。
最佳答案
答案是否定的,没有人知道如何做到这一点。对于发现这个问题的任何其他人,这就是我想出的:
#ifdef _MSC_VER
#define U16S(x) L##x
#define U16XS(x) L##x
#define XS(x) x
#define US(x) x
#elif defined __linux
#define U16S(x) u##x
#define U16XS(x) reinterpret_cast<const unsigned short *>(u##x)
inline unsigned short *XS(char16_t* x) {
return reinterpret_cast<unsigned short *>(x);
}
inline const unsigned short *XS(const char16_t* x) {
return reinterpret_cast<const unsigned short *>(x);
}
inline char16_t* US(unsigned short *x) {
return reinterpret_cast<char16_t *>(x);
}
inline const char16_t* US(const unsigned short *x) {
return reinterpret_cast<const char16_t*>(x);
}
#include "char16_t_facets.hpp"
#endif
namespace SafeStrings {
#if defined _MSC_VER
using u16char_t = wchar_t;
using u16string_t = std::wstring;
using u16sstream_t = std::wstringstream;
using u16ostream_t = std::wostream;
using u16istream_t = std::wistream;
using u16ofstream_t = std::wofstream;
using u16ifstream_t = std::wifstream;
using filename_t = std::wstring;
#elif defined __linux
using u16char_t = char16_t;
using u16string_t = std::basic_string<char16_t>;
using u16sstream_t = std::basic_stringstream<char16_t>;
using u16ostream_t = std::basic_ostream<char16_t>;
using u16istream_t = std::basic_istream<char16_t>;
using u16ofstream_t = std::basic_ofstream<char16_t>;
using u16ifstream_t = std::basic_ifstream<char16_t>;
using filename_t = std::string;
#endif
char16_t_facets.hpp
具有模板特化的定义 std::ctype<char16_t>
, std::numpunct<char16_t>
, std::codecvt<char16_t, char, std::mbstate_t>
.有必要将这些与 std::num_get<char16_t>
一起添加到全局语言环境中和 std::num_put<char16_t>
(但没有必要为这些提供特化)。 codecvt
的代码是唯一困难的一点,可以在 GCC 5.0 库中找到一个合理的模板(如果您使用 GCC 5,则不需要提供 codecvt
特化,因为它已经在库中)。
完成所有这些后,char16_t
流将正常工作。
然后,每次定义一个宽字符串,而不是L"string"
, 写 U16S("string")
.每次将字符串传递给 Xerces 时,为文字编写 XS(string.c_str()) 或 U16XS("string")。每次从 Xerces 获取字符串时,将其转换回 u16string_t(US(call_xerces_function()))
.
请注意,也可以将字符类型设置为 char16_t 来重新编译 Xerces-C。这消除了上面所需的大量工作。 但是您将无法在系统上使用任何其他依赖于 Xerces-C 的库。链接到任何此类库都会导致链接错误(因为更改字符类型会更改许多 Xerces 函数签名)。
关于c++ - Xerces-c 和跨平台字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782247/
我之前在 RapidXml 中询问过一个类似的问题,我现在想知道,相同但使用 Xerces-C。 我正在开发一个需要解析 xml 的 C++ 应用程序。 考虑以下几点: xml文件:file1.xml
我支持使用 Xerces-C 进行 XML 解析的遗留 C++ 应用程序。我被 .Net 宠坏了,习惯了使用 XPath 从 DOM 树中选择节点。 有什么方法可以访问 Xerces-C 中一些有限的
我必须将我的项目从 xerces 1 迁移到 xerces 3.1.1,但我找不到 DOMString.hpp。有人知道我在哪里可以找到这门课吗? 最佳答案 DOMString 是 gone在 Xer
我正在使用 JSF 2.0、NetBeans 6.9.1、GlassFish Server 3.1、mojarra 2.0.3 和 JasperReports 3.7.6 开发 Web 应用程序。我的
我在gradle项目中使用Xerces jar,然后在gradle插件中使用该项目的jar:实际上,我正在开发一个gradle插件,其中包含使用gradle项目jar的某些功能的自定义任务;当我尝试运
我收到错误 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xerces/util/XMLChar
我在 there 中提到过类似的问题.我正在使用 mvn clean compile site 命令,我的版本是: cobertura.version: 2.5.1 findbugs.version:
我正在 Eclipse 中开发 GWT 应用程序并使用 jdom2 读取一些自定义 xml 属性文件。 在最近的更新之后,我的应用程序现在在尝试读取 xml 文件时失败并出现上述错误。相关堆栈跟踪是:
我安装了 Android Studio 1.5.1 并测试了默认的“Hello World”应用程序,该应用程序完美构建并在我的手机上运行。但是,我尝试对 CardEmulation 执行相同的操作代
这个问题在这里已经有了答案: Xerces error: org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl (2 个答案) 关闭 5 年前。 我正在使用
我有一个 Sax 解析器类,用于 Swing 应用程序和部署到 GlassFish 的 Web 项目。 该类解析 xml 文件。它在 Netbeans IDE Swing 应用程序(在 IDE 中)和
我有一个 XSD 文件: ... 在 Java 代码中: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); db
我已经在 linux 上下载并构建了 Xerces-c: Linux xxxx 2.6.24.7-server-3mnb #1 SMP Wed Sep 9 16:34:18 EDT 2009 x86_
我按照 build xerces in linux 的说明进行操作 。/配置 制作 进行安装 但我正在尝试运行来自 Programming Guide 的第一个示例 #include // Othe
我有一个基于 XSD 的 XML,看起来像这样: abc def 我使用的是 C++,我可以成功读取 XML 并对其进行解析。但是我想使用不带命名空间的标签名称获取我的元素,例如
我正在尝试在 Mac 上运行 Xerces。我我们 ./configure CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" ./configure --p
有谁知道是否有一个与 Python2.6 兼容的可用 python 库,可以公开 Xerces 功能及其 XML DOM 功能? 我将所需的功能定义为:通过 Xpath 和 XSLT 处理器选择 XM
我想使用 Xerces 从字符串加载 XML 模式,但直到现在,我只能从 URI 加载它: final XMLSchemaLoader xsLoader = new XMLSchemaLoader()
我的问题是: 如果我有以下 XML: 1 然后我将添加以下路径: 2 结果 1 2 我希望能够将它转换成这样:
我需要从自己的流中读取数据,并在到达时使用Xerces / C++(SAX或SAX2)对其进行解析。我已经看到Xerces Java FAQ了,但是Java和C++ API似乎并不匹配。至少,我在C+
我是一名优秀的程序员,十分优秀!