GNAT 18.1将字符视为字符串

Lnl*_*nlB 3 string ada char

我将我的项目从GNAT 7.3.1传递到GNAT 18.1,并且我对char效果有一个编译错误.

我想在字符串的末尾影响度'°'的特殊字符,但是编译器会给我这个错误:

R : String := "-NNN.N°";
begin
   ...
   R(R'Last) := '°';
   return R;
end
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

strings are delimited by double quote character
expected type "Standard.Character"
found a string type
Run Code Online (Sandbox Code Playgroud)

如果我用符号或数字替换符号°,它就可以工作.如果我试图投入到R(R'Last) := Standard.Character('°');编译器中说同样的话.

任何人都遇到过同样的问题?

Sim*_*ght 10

您的代码(从此处复制并粘贴到我的编辑器中)是UTF-8编码的,因此您的学位符号使用两个字节(十六进制)进行编码C2B0.

GNAT默认会使用Latin-1,所以你必须告诉它在字符/字符串/文本IO中使用UTF-8 -gnatW8.

举个例子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;
Run Code Online (Sandbox Code Playgroud)

编译(在macOS上)

$ gnatmake lnlb.adb -gnatW8
gcc -c -gnatW8 lnlb.adb
gnatbind -x lnlb.ali
gnatlink lnlb.ali
Run Code Online (Sandbox Code Playgroud)

并运行

$ ./lnlb
-NNN.N°
Run Code Online (Sandbox Code Playgroud)