iachar与achar在ASCII排序序列的字符和编码之间转换,ichar与char则使用处理器的本机字符集。它们常用于字符分类、协议字段和可控的ASCII转换;适合单个字符的编码操作,不用于把文本“154”解析成整数154。
语法结构
code = iachar(character)
character = achar(code)
code = ichar(character)
character = char(code)
- iachar与ichar只读取字符实参的第一个字符,返回整数编码。
- achar使用ASCII排序序列,char使用处理器字符集;只有在本机字符集与ASCII一致时,相同字符的结果通常相同。
- 字符码转换不同于数值文本解析。文本与数值之间的格式化转换应使用内部文件I/O。
本文代码
! 使用ASCII序列转换字母,并验证本机字符码的往返转换。
program characterCodesDemo
implicit none
character :: upperLetter, lowerLetter, symbol
integer :: asciiCode, nativeCode
upperLetter = "G"
asciiCode = iachar(upperLetter)
lowerLetter = achar(asciiCode + iachar("a") - iachar("A"))
symbol = "*"
nativeCode = ichar(symbol)
print "(A,A)", "原大写字母:", upperLetter
print "(A,I0)", "ASCII码:", asciiCode
print "(A,A)", "转换后小写字母:", lowerLetter
print "(A,I0)", "星号的本机字符码:", nativeCode
print "(A,A)", "CHAR往返结果:", char(nativeCode)
end program characterCodesDemo
编译运行
(base) hong@hongdeMacBook-Pro 060.characterCodes % gfortran -Wall -Wextra -std=f2018 exampleCharacterCodes.f90 -o characterCodesDemo
(base) hong@hongdeMacBook-Pro 060.characterCodes % ./characterCodesDemo
原大写字母:G
ASCII码:71
转换后小写字母:g
星号的本机字符码:42
CHAR往返结果:*
现象分析
ASCII中G的编码是71,a与A的编码差为32,因此71+(97-65)=103,achar(103)得到小写g。代码没有直接写死32,而是由iachar计算两个字母的间距。
本机运行环境中星号的字符码是42,char(ichar(‘*’))重新得到星号,说明同一处理器上的本机字符码往返成立。
71和42是本次ASCII兼容环境的具体结果。需要明确ASCII语义时使用iachar/achar;仅需处理器内部往返时才使用ichar/char。
核心知识点
- iachar/achar明确采用ASCII排序序列。
- ichar/char采用处理器字符集,具体整数值可能不可移植。
- 这些过程处理字符码,不负责格式化数值与字符串之间的转换。