私はLazarus 1.6.4とFPC 3.0.2を使って、WindowsではUSERNAMEを、LinuxではUSERを取得するコードをいくつか書いています。これを達成するために、私はSysUtils.GetEnvironmentVariable関数を使用しました。 Linuxでは完璧に動作しますが、WindowsではUTF8文字列が間違ったエンコードで開かれたようなものが壊れてしまいます。 Windowsの私のUSERNAMEにはキリル記号があるので、GetEnvironmentVariableの代わりに????????
が返されますが、Пользователь
になるはずです。ここ 私のコード:FreePascal:非ラテンのWindowsでGetEnvironmentVariableを使用するには?
function GetUserName: string;
{$IFDEF MSWINDOWS}
const
envVar = 'USERNAME';
{$ENDIF}
{$IFDEF UNIX}
envVar = 'USER';
{$ENDIF}
begin
Result := SysUtils.GetEnvironmentVariable(envVar);
{$IFDEF MSWINDOWS}
{ TODO : BUG: Does not work correct for non-latin strings }
Result := LazUTF8.UTF8ToWinCP(Result)
{$ENDIF}
end;
そして、それは内部の非latain記号が含まれている場合、それが破損した文字列を返します。
WindowsオペレーティングシステムでGetEnvironmentVariableを正しいエンコーディングにするにはどうすればよいですか?
これはWindowsでユーザー名を取得する方法ではなく、さらにWindowsでANSIエンコーディングを使用したくない場合です。 –
@DavidHeffernan詳しく説明してください。何をお勧めしますか? –
制限された文字セットしかエンコードできないため、ANSIエンコーディングを使用する必要はありません。また、現在のユーザー名を取得するには、そのサービスを提供するWin32 API関数を使用します。たとえば、 'GetUserName'です。多分LazarusやFPC RTLは既にそれをラップしていますが、わかりません。 –