理解 libiconv
本节将涵盖 iconv 应用程序编程接口(API)转换。
通常,iconv 应用程序编程接口(API)由下列实现转换的子例程组成:
- iconv_open
- 在将字符从 FromCode 参数指定的代码集转换为 ToCode 参数指定的代码集时,执行必需的初始化工作。 所指定的字符串取决于系统上安装的转换器。 如果初始化成功,转换器描述符 iconv_t 以其初始状态返回。
- 图标
- 使用从 iconv_open 子例程获得的描述符调用转换器函数。 inbuf 参数指向输入缓冲区中的第一个字符,而
inbytesleft 参数表示到被转换的缓冲区结束之前的字节数。 outbuf 参数指向输出缓冲区中的第一个空闲的字节,而 outbytesleft 参数表示到该缓冲区结束之前的空闲字节数。
对于状态有关的编码方式,用值为空指针的 inbuf 进行一次调用,那么该子例程会被置为其初始状态。 后续调用的 inbuf 参数如果不是空指针,将使该函数的内部状态根据需要而变。
- 图标关闭
- 关闭由 cd 变量指定的转换描述符并使之可再次使用
在网络环境中,以下因素决定了应如何转换数据:
- 发送方和接收方的代码集
- 通信协议(8 位或 7 位数据)
下表概述了使用相同代码集的系统的转换方法,并建议了在不同情况下如何转换数据。
| 标准 | 通信协议 | 通信协议 |
|---|---|---|
| 可选方法 | 仅 7 位 | 8 位 |
| 保持不变 | 无效 | 最佳选择 |
| fold7 | 确定 | 确定 |
| fold8 | 无效 | 确定 |
| uucode | 最佳选择 | 确定 |
此表显示了使用不同代码集或接收方代码集未知时与系统的通信。
| 标准 | 通信协议 | 通信协议 |
|---|---|---|
| 可选方法 | 仅 7 位 | 8 位 |
| 保持不变 | 无效 | 如果远程代码集未知则无效 |
| fold7 | 最佳选择 | 确定 |
| fold8 | 无效 | 最佳选择 |
| uucode | 无效 | 无效 |
如果发送方和接收方使用相同的代码集,那么存在以下可能性:
- 如果协议允许 8 位数据,无需转换即可发送数据。
- 如果协议只允许 7 位数据,8 位代码点必须映射为 7 位值。 可使用 iconv 接口和以下某个方法:
- uucode
- 提供与 uuencode 和 uudecode 命令相同的映射。 这是推荐的方法。
- 7 位
- 使用 7 位数据转换内部代码集。 该方法原封不动的传递 ASCII。
如果发送方和接收方使用不同的代码集,存在两种可能性:
- 如果协议仅允许 7 位数据,那么使用 fold7 方法。
- 如果协议允许 8 位数据,并且接收方的代码集已知,那么使用 iconv 接口转换数据。 如果接收方的代码集未知,那么使用以下方法:
- 8 位
- 将内部代码集转换为标准交换格式。 此方法传输 8 位数据,并且保留信息,这样接收方就可以自身的代码集重构数据。