将 Mac 从 Sierra 升级到 High Sierra 后,当我使用终端 SSH 连接到 Centos(6 和 7)时,收到 setlocale 警告。
认为有一些解决方法可以解决这些问题,我发现问题是 locale 环境变量.bash_profile都是小写的en_us.utf-8。更改它以en_US.UTF-8 解决问题。
我尝试过的其他解决方案,在互联网上找到的是:
在 CentOS(服务器)中
LC_LANG=en_US.utf8修复/etc/environments问题。在 Mac(客户端)中
如果我运行locale -a,区域设置是
en_US.utf8在 CentOS 和
en_US_UTF-8在 MacOS 上
CentOS 和 MacOS 中语言环境变量的规范化过程似乎有所不同。在 CentOS 上,它似乎标准化UTF-8为小写并会删除连字符,但en_US在这种情况下需要。在 MacOS 上,它似乎标准化为大写并且需要连字符并接受 的任何大小写混合en_US。因此,兼容的设置是en_US.UTF-8三个字母UTF在任何情况下都可以出现的位置。
(这就是为什么我无法通过在 Mac 中将区域设置变量设置为 来解决问题en_US.utf8,它会将 更改LC_ALL为空白。) …
我正在编写一个程序,使用Delphi 2010对字节序列进行Z85Encoding.所以我写了一个funtiom
function Z85Encode(input, output: TStream): integer
Run Code Online (Sandbox Code Playgroud)
并希望传入一个流.接下来我写了一个重载函数
function Z85Encode(b: TBytes): string;
Run Code Online (Sandbox Code Playgroud)
将字节序列写入TBytesStream(与TMemoryStream相同),调用encode函数,然后将编码数据读取到Result字符串.
问题是我发现TStream.Read的行为与文档非常不同,我无法理解.你可以用其他方式来完成这个功能,但我不太明白为什么?我可能想知道Delphi如何实现TBytes类型.
为了说明我的问题,我编写了以下测试程序
procedure Test;
var
iStream: TMemoryStream;
n: integer;
a: TBytes;
b: TBytes
c: array [0..4] of Byte;
begin
b := TEncoding.UTF8.GetBytes('abcdefghij'); // byte from 97 to 106
iStream := TMemoryStream.Create;
try
iStream.Write(b, Length(b));
iStream.Seek(0, soBeginning);
n := iStream.Read(a, 5); // expect only 5 bytes read, but the whole array is back.
ShowMessage(IntToStr(n)); // n is 5
ShowMessage(IntToStr(Length(a))); // length is 10!!
iStream.Seek(0, soBeginning);
n := iStream.Read(c, …Run Code Online (Sandbox Code Playgroud)