我将我的项目从GNAT 7.3.1传递到了GNAT 18.1,并且在char影响上遇到了编译错误。
我想影响字符串末尾度数'°'的特殊字符,但编译器向我返回此错误:
Map(COL1 -> "loe", COL2 -> "MFM---0521")
我知道了:
R : String := "-NNN.N°";
begin
...
R(R'Last) := '°';
return R;
end
如果我将符号°替换为字母或数字,则可以使用。
如果我尝试投射到strings are delimited by double quote character
expected type "Standard.Character"
found a string type
中,则编译器会说同样的话。
有人遇到过同样的问题吗?
答案 0 :(得分:10)
您的代码(从此处复制并粘贴到我的编辑器中)是UTF-8编码的,因此您的度数符号使用两个字节(十六进制C2B0
)进行编码。
默认情况下,GNAT期望Latin-1 so you have to tell it在使用-gnatW8
的字符/字符串/文本IO中使用UTF-8。
以lnlb.adb
为例,
with Ada.Text_IO;
procedure Lnlb is
R : String := "-NNN.NX";
begin
R(R'Last) := '°';
Ada.Text_IO.Put_Line (R);
end Lnlb;
编译(在macOS上)
$ gnatmake lnlb.adb -gnatW8
gcc -c -gnatW8 lnlb.adb
gnatbind -x lnlb.ali
gnatlink lnlb.ali
然后运行
$ ./lnlb
-NNN.N°
答案 1 :(得分:4)
字符被定义为Latin-1,因此当使用标准键盘上不直接可用的字符时,最好用不同于字符字面量的其他方式来引用它们:
R (R'Last) := Ada.Characters.Latin_1.Degree_Sign;
或
R (R'Last) := Character'Val(176); -- Degree symbol