Lazarus 字符集转换 Utf8ToAnsi,UTF8ToWinCP,UTF8ToSys,UTF8ToConsole

由于Lazarus从1.2版开始默认字符集就是UTF8,如果要转到系统正常显示或文本保存,就必须对字符集进行转换。Lazarus提供了很多函数。如题。

那么这里面有什么关系呢?

UTF8ToSys 需要 启用编译参数 –dDisableUTF8RTL,否则还是UTF8,如果变码还是Utf8ToAnsi,但做了基本的处理。

对应代码

function UTF8ToSys(const s: string): string;
begin
  {$IFDEF UTF8_RTL}
  Result:=s;
  {$ELSE}
  if NeedRTLAnsi and (not IsASCII(s)) then
    Result:=UTF8ToAnsi(s)
  else
    Result:=s;
  {$ENDIF}
end;

Utf8ToAnsi是freePascal 自带的,变码道Ansi ,在ustringh.inc文件里面

function Utf8ToAnsi(const s : RawByteString) : RawByteString;{$ifdef SYSTEMINLINE}inline;{$endif}
  begin
    Result:=RawByteString(Utf8Decode(s));
  end;
{$ifdef FPC_HAS_CPSTRING}
  RawByteString       = type AnsiString(CP_NONE);
{$else FPC_HAS_CPSTRING}
  RawByteString       = ansistring;
{$endif FPC_HAS_CPSTRING}

UTF8ToWinCP 是Lazarus 针对Windows 功能封包,不变化代码页,仅仅变化字符编码

{$ifdef WinCe}
function UTF8ToWinCP(const s: string): string; inline;
begin
  Result := Utf8ToSys(s);
end;
{$else}
function UTF8ToWinCP(const s: string): string;
// result has codepage CP_ACP
var
  src: UnicodeString;
  len: LongInt;
begin
  Result:=s;
  if IsASCII(Result) then begin
    {$ifdef FPC_HAS_CPSTRING}
    // prevent codepage conversion magic
    SetCodePage(RawByteString(Result), CP_ACP, False);
    {$endif}
    exit;
  end;
  src:=UTF8Decode(s);
  if src=‘‘ then
    exit;
  len:=WideCharToMultiByte(CP_ACP,0,PUnicodeChar(src),length(src),nil,0,nil,nil);
  SetLength(Result,len);
  if len>0 then begin
    WideCharToMultiByte(CP_ACP,0,PUnicodeChar(src),length(src),@Result[1],length(Result),nil,nil);
    {$ifdef FPC_HAS_CPSTRING}
    // prevent codepage conversion magic
    SetCodePage(RawByteString(Result), CP_ACP, False);
    {$endif}
  end;
end;
{$endif not wince}

UTF8ToConsole 是Lazarus 针对Windows 功能封包 ,变码后,同时会配置成默认代码页文本。

{$ifdef WinCe}
function UTF8ToConsole(const s: string): string; // converts UTF8 to console string (used by Write, WriteLn)
begin
  Result := UTF8ToSys(s);
end;
{$else}
function UTF8ToConsole(const s: string): string; // converts UTF8 to console string (used by Write, WriteLn)
var
  Dst: PChar;
begin
  {$ifndef NO_CP_RTL}
  Result := UTF8ToWinCP(s);
  {$else NO_CP_RTL}
  Result := UTF8ToSys(s); // Kept for compatibility
  {$endif NO_CP_RTL}
  Dst := AllocMem((Length(Result) + 1) * SizeOf(Char));
  if CharToOEM(PChar(Result), Dst) then
    Result := StrPas(Dst);
  FreeMem(Dst);
  {$ifndef NO_CP_RTL}
  SetCodePage(RawByteString(Result), CP_OEMCP, False);
  {$endif NO_CP_RTL}
end;
{$endif not WinCE}

原文地址:https://www.cnblogs.com/hieroly/p/10888508.html

时间: 2024-08-01 21:41:42

Lazarus 字符集转换 Utf8ToAnsi,UTF8ToWinCP,UTF8ToSys,UTF8ToConsole的相关文章

libiconv字符集转换库在C#中的使用

<libiconv字符集转换库使用方法>一文中说到了libiconv可以实现不同字符集的转换.比如GBK转BIG5等.在项目中因为需要,找到这个库.可是这个库在C#中没有很好的支持.不过,想着既然是C++的库,那只要动态加载DLL的接口就好了.可是调用并不顺利,传进去的IntPtr或者byte数组总是拿不到数据.后面回到了C++的方式去调用,几经调试,总算找到了原因. 是iconv接口在转换完成后,指针的位置往后移了.而在C#中调用DLL后回来的指针,已经是移动后的,所以拿不到所要的数据. 经

iconv_open函数申请一个字符集转换的描述符

iconv_open函数 iconv_open函数 iconv_open——申请一个字符集转换的描述符 #include <iconv.h> iconv_t iconv_open(const char* tocode,const char* fromcode) 描述: iconv_open()函数申请一个转换描述符,转换字符序列从编码fromcode到编码tocode 转换描述符包含转换状态,调用iconv_open创建以后,转换状态处于初始状态,调用iconv函数以后改变转换描述符的转换状态

Python任意字符集转换

在python处理文本的过程中,经常会有文本字符集转换的情况, 而我们希望用一个方法,不用关心文本原本的字符集是什么样的,直接转换成想要的任何字符集就可以了. 方法一: import chardet def convert_encoding(data,new_coding='UTF-8'): # 任意字符集转换 encoding = chardet.detect(data)['encoding'] if new_coding.upper() != encoding.upper(): data =

字符集转换引发插入乱码问题

根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect string value: '\x91;offl...' for column 'c' at row 1 重现: 1)连接MySQL字符集是UTF8 mysql --default-character-set=utf8 test 2)表结构 CREATE TABLE `abc` ( `id` int(1

Oracle字符集转换

这几天在工作中碰到一个字符乱码的问题,发现在cmd窗口的sqlplus中直接update一个中文和使用@调用一个文件作同样更新的时候,存储的结果 竟不一样.一时比较迷惑,对Oracle如何处理各个字符集的问题不是很清楚.特此通过一些资料和实验总结,系统学习一下Oracle中字符集的相关知 识. 一. 字符集的基础知识:在网络上已有不少网友对字符集进行了研究,个人觉得有几个不错的网站可以参考http://blog.csdn.net/tianlesoftware/article/details/49

c++ 字符集转换

转码整理, 资料来源于网络 charset.h #pragma once #include <iostream> #include <string> std::string UnicodeToAnsi(const std::wstring& unicode); std::wstring AnsiToUnicode(const std::string& ansi); std::string AnsiToUtf8(const std::string& strSr

【Teradata】Latin和Unicode字符集转换(自定义函数udf_w936to16和udf16tow936)

1.安装UDF函数 (1)下载GBK2Unicode.zip,地址为https://downloads.teradata.com/tag/udf (2)windows或者Linux环境下使用bteq进行安装. 进入文件所在目录,输入如下命令(windows中使用dos) bteq .logon 192.168.253.222/citic_edw 输入口令后,输入如下命令 database syslib; .run file=16_936.sql 验证syslib库中是否存在udf_w936to1

C语言字符集转换

#include "codechange.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Windows.h>#include <locale.h> wchar_t *ANSITOUnicode(const char* str){    int textlen = 0;    wchar_t *result = NULL;    textl

oracle 字符集转换:AL32UTF8-&gt;ZHS16GBK

select userenv('language') from dual; --修改Oracle数据库字符集为ZHS16GBK : SQL>conn / as sysdba; SQL>shutdown immediate; SQL>startup mount; SQL>alter system enable restricted session; SQL>alter system set job_queue_processes=0; SQL>alter system s