IPBS_Station/SDK/Depend/cppp-reiconv/cmake-build-debug/include/cppp/reiconv.hpp.inst
2025-09-05 08:44:30 +08:00

307 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file cppp/reiconv.hpp
* @author ChenPi11
* @brief C++ Plus cppp-reiconv package.
* @version 2.1.0
* @date 2023-7-28
* @copyright Copyright (C) 1999-2023 Free Software Foundation, Inc.
*/
/* 版权所有 (C) 1999-2023 Free Software Foundation, Inc.
本文件是 cppp-reiconv 库的一部分。
cppp-reiconv 库是自由软件,您可以在自由软件基金会发布的 GNU Lesser General Public
License 版本 3 或者(根据您的选择)任何以后的版本下重新分发和/或修改它。
cppp-reiconv 库被分发,希望它对您有用,但没有任何担保;甚至没有暗示的担保
商业性和特定目的适用性的担保。请参阅 GNU Lesser General Public License 获取更多详细信息。
您应该已经收到了 GNU Lesser General Public License 的副本
与 cppp-reiconv 库一起;请参阅 COPYING 文件。
如果没有,请参阅 https://www.gnu.org/licenses/ 。 */
/* 安装之后,这个文件叫做 “cppp/reiconv.hpp”。 */
#ifndef _CPPP_REICONV_HPP
#define _CPPP_REICONV_HPP
#if _MSC_VER >= 1600
/* 使用 UTF-8 解析这个文件 */
#pragma execution_character_set("utf-8")
#endif
#include <exception>
#include <iostream>
#include <errno.h>
#include <time.h>
#include <vector>
#include <wchar.h>
extern "C++"
{
namespace cppp
{
namespace base
{
namespace reiconv
{
/**
* @brief 版本信息。 算法:(major<<8) + minor
*/
extern __declspec(dllimport) int reiconv_version;
#undef iconv_t
/**
* @typedef void*
* @brief 从一个字符集到另一个字符集中的转换方法的标识符。
*/
typedef void *iconv_t;
#undef iconv_open
/**
* @brief 为从编码 “fromcode” 到编码 “tocode” 的编码转换分配描述符。
* @param tocode 目标编码。
* @param fromcode 原编码。
* @return 分配的 iconv 描述符。
*/
extern __declspec(dllimport) iconv_t iconv_open(const char *tocode, const char *fromcode);
/**
* @brief 为从代码页 “fromcode_cp” 到代码页 “tocode_cp” 的编码转换分配描述符。
* @param tocode_cp Target codepage.
* @param fromcode_cp From codepage.
* @param strict Strict mode, if false, will ignore the invalid characters.
* @note Some encoding may don't have codepage.
* @return Allocated iconv conversation buffer's pointer.
*/
extern __declspec(dllimport) iconv_t iconv_open(int tocode_cp, int fromcode_cp, bool strict = true);
#undef iconv
/**
* @brief 使用转换描述符 “cd”将最多 “*inbytesleft” 字节从 “*inbuf” 开始转换,并将最多 “*outbytesleft” 字节写入
* “*outbuf” 。
* @attention 将 “*inbytesleft” 减少相同的数量,并将 “*inbuf” 增加相同的数量。
* @attention 将 “*outbytesleft” 减少相同的数量,并将 “*outbuf” 增加相同的数量。
* @param cd 转换描述符。
* @param inbuf 输入缓冲区。
* @param inbytesleft 剩余输入字节。
* @param outbuf 输出缓冲区。
* @param outbytesleft 剩余输出字节。
* @return 转换的字符数量(不包括终止符,-1 表示错误)。
*/
extern __declspec(dllimport) size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf,
size_t *outbytesleft);
#undef iconv_close
/**
* @brief 释放为转换描述符 “cd” 分配的资源。
* @param cd 您想要释放的 iconv 转换描述符。
* @return 操作状态。(-1 表示错误0 表示成功)。
*/
extern __declspec(dllimport) int iconv_close(iconv_t cd);
/**
* @brief 设置描述符的属性
* @param cd 转换描述符。
* @param request 属性请求 ID。
* @param argument 属性的值。
* @return 操作状态(>=0 表示成功,<0 表示错误)。
*/
extern __declspec(dllimport) int iconvctl(iconv_t cd, int request, void *argument);
/**
* @typedef void (*) (unsigned int, void*)
* @brief 在每次成功转换 Unicode 字符之后执行的钩子函数。
*/
typedef void (*iconv_unicode_char_hook)(unsigned int uc, void *data);
/**
* @brief 钩子函数集。
*/
struct iconv_hooks
{
iconv_unicode_char_hook uc_hook;
void *data;
};
/**
 * @brief 回调函数。当少量字节无法转换为 Unicode 字符时调用。
* 此函数应处理 “inbuf” 中的所有字节,并通过多次调用 “write_replacement” 回调函数生成替换的 Unicode 字符。
 */
typedef void (*iconv_unicode_mb_to_uc_fallback)(const char *inbuf, size_t inbufsize,
void (*write_replacement)(const unsigned int *buf, size_t buflen,
void *callback_arg),
void *callback_arg, void *data);
/**
* @brief 回调函数。在无法将 Unicode 字符转换为目标编码时调用。
* 此函数应处理字符,并可通过重复调用 “write_replacement” 回调来生成替代字节(使用目标编码)。
*/
typedef void (*iconv_unicode_uc_to_mb_fallback)(unsigned int code,
void (*write_replacement)(const char *buf, size_t buflen,
void *callback_arg),
void *callback_arg, void *data);
/**
* @brief 回调函数集。
*/
struct iconv_fallbacks
{
iconv_unicode_mb_to_uc_fallback mb_to_uc_fallback;
iconv_unicode_uc_to_mb_fallback uc_to_mb_fallback;
void *data;
};
/**
* @brief Surfaces. “Surfaces” 是在 “recode” 手册中描述的概念。
*/
constexpr int ICONV_SURFACE_NONE = 0;
/**
* @brief 在 EBCDIC 编码中0x15用于编码“换行符功能”参见 Unicode 标准第 5 章)将映射为 U+000A 而不是 U+0085 。
* 这是为了在 z/OS 上与 C 程序和 Unix 环境实现互操作性。
*/
constexpr int ICONV_SURFACE_EBCDIC_ZOS_UNIX = 1;
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_TRIVIALP = 0; /* int *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_GET_DISCARD_ILSEQ = 3; /* int *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_SET_DISCARD_ILSEQ = 4; /* const int *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_SET_HOOKS = 5; /* const struct iconv_hooks *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_SET_FALLBACKS = 6; /* const struct iconv_fallbacks *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_GET_FROM_SURFACE = 7; /* unsigned int *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_SET_FROM_SURFACE = 8; /* const unsigned int *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_GET_TO_SURFACE = 9; /* unsigned int *argument */
/**
* @brief “iconvctl” 的 “request”.
*/
constexpr int ICONV_SET_TO_SURFACE = 10; /* const unsigned int *argument */
/**
* @brief 列出与区域设置无关的编码方式。
* @param do_one 一个编码回退函数。
* @param data 数据。
*/
extern __declspec(dllimport) void iconvlist(int (*do_one)(unsigned int namescount, const char *const *names, void *data),
void *data);
/**
* @brief 使用 iconv 将整个字符串从一种编码转换为另一种编码。比直接使用 iconv() 函数更简单。
* @note 该函数不特殊处理 '\0' 字符。
* @param cd 转换描述符。
* @param start 源字符串起始指针。
* @param end 源字符串结束指针。
* @param resultp 结果内存指针。
* @param lengthp 指向存储结果长度的变量的指针。
* @return 如果成功,返回 0 ,否则返回 errno 并设置 errno 。特定的 errno 值包括 EILSEQ 和 ENOMEM 。
*/
extern __declspec(dllimport) int iconv_string(const iconv_t& cd, const char *start,
const char *end, char **resultp, size_t *lengthp);
/**
* @brief 将整个字符串从一种编码转换为另一种编码,并支持自动检测输入编码。
*
* @note 将以编码 FROMCODE 给出的内存区域转换为以编码 TOCODE 给出的新内存区域。 FROMCODE 和 TOCODE 与 iconv_open(3) 中的参数相同,但 FROMCODE 可能是以下值之一。
*
* @note "autodetect_utf8" 支持 ISO-8859-1 和 UTF-8
* @note "autodetect_jp" 支持 EUC-JP 、 ISO-2022-JP-2和 SHIFT_JIS
* @note "autodetect_kr" 支持 EUC-KR 和 ISO-2022-KR
* @note 输入位于 start (包含)和 end (不包含)之间的内存区域。如果 resultp 不为 NULL ,则输出字符串存储在 *resultp 中; malloc/realloc 用于分配结果。
*
* @note 该函数不特殊处理零字符。
* @param tocode 目标编码。
* @param fromcode 源编码。
* @param start 源字符串起始指针。
* @param end 源字符串结束指针。
* @param resultp 结果内存指针。
* @param lengthp 指向存储结果长度的变量的指针。
* @return 如果成功返回0否则返回 errno 并设置 errno 。特定的 errno 值包括 EILSEQ 和 ENOMEM 。
*
* @example
* const char* s = ...;
* char* result = NULL;
* if (iconv_string("UCS-4-INTERNAL", "GBK",
* s, s+strlen(s)+1, &result, NULL) != 0)
* perror("iconv_string");
*
*/
extern __declspec(dllimport) int iconv_string(const char* tocode, const char* fromcode, const char* start,
const char* end, char** resultp, size_t* lengthp);
/**
* @brief 将整个字符串从一种编码转换为另一种编码。
* @note 该函数不特殊处理零字符。
* @param tocode_cp 目标编码页。
* @param fromcode_cp 源编码页。
* @param start 源字符串起始指针。
* @param end 源字符串结束指针。
* @param resultp 结果内存指针。
* @param lengthp 指向存储结果长度的变量的指针。
* @param strict 严格模式,如果为 false ,将忽略无效字符。
* @return 如果成功,返回 0 ;否则返回 errno 并设置 errno 。特定的 errno 值包括 EILSEQ 和 ENOMEM 。
*
* @example
* const char* s = ...;
* char* result = NULL;
* if (iconv_string(65001, 936,
* s, s+strlen(s)+1, &result, NULL) != 0)
* perror("iconv_string");
*
*/
extern __declspec(dllimport) int iconv_string(int tocode_cp, int fromcode_cp, const char* start,
const char* end, char** resultp, size_t* lengthp, bool strict=true);
/**
* @brief 将源字符串编码为另一种编码方式。
* @param from 源编码。
* @param to 目标编码。
* @param data 输入字符串数据。
* @param ignore 忽略无效字符。
* @throw int当转换错误时抛出 “errno” ,您可以捕获 errno 以获取更多信息。
*/
inline std::vector<char> encode(const std::string& from, const std::string& to, const std::vector<char>& data,
bool ignore = false)
{
char *result = NULL;
size_t length = 0;
std::string ignstr = ignore ? "//IGNORE" : "";
if (iconv_string((to + ignstr).c_str(), from.c_str(), data.data(), data.data() + data.size(), &result,
&length) < 0)
{
if (!ignore)
{
/* When conversation error, throw the errno, you can catch the errno for more infomation. */
throw(int)(errno);
}
}
return std::vector<char>(result, result + length);
}
} // namespace reiconv
} // namespace base
} // namespace cppp
}
#endif /* _CPPP_REICONV_HPP */