理解 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
    提供与 uuencodeuudecode 命令相同的映射。 这是推荐的方法。
    7 位
    使用 7 位数据转换内部代码集。 该方法原封不动的传递 ASCII。

如果发送方和接收方使用不同的代码集,存在两种可能性:

  • 如果协议仅允许 7 位数据,那么使用 fold7 方法。
  • 如果协议允许 8 位数据,并且接收方的代码集已知,那么使用 iconv 接口转换数据。 如果接收方的代码集未知,那么使用以下方法:
    8 位
    将内部代码集转换为标准交换格式。 此方法传输 8 位数据,并且保留信息,这样接收方就可以自身的代码集重构数据。