Delphi的unicode与GB2312转转换, 汉字unicode转GB2312
{===============================================================}
{ 函数 : RESULTSTRING = HexToBin(HEXSTRING)
{ 目的 : 把十六进制字符串转换为二进制字符串
{
{===============================================================}
{ 函数 : RESULTINTEGER = HexCharToInt(HEXCHAR)
{ 目的 : 转换一个十六进制字符为整数
{===============================================================}
{ 函数 : RESULTSTRING = HexCharToBin(HEXCHAR)
{ 目的 : 转换一个十六进制字符为二进制字符串
{===============================================================}
{ 函数 : RESULTINTEGER = Pow(BASE,POWER)
{ 目的 : 指数函数
{===============================================================}
{ 函数 : RESULTINTEGER = BinStrToInt(BINSTRING)
{ 目的 : 把二进制字符串转换为整数
{===============================================================}
{ 函数 : RESULTSTRING = DecodeSMS7Bit (PDUSTRING)
{ 目的 : 解码一个7-bit SMS (GSM 03.38) 为ASCII码
{===============================================================}
{ 函数 : RESULTSTRING = ReverseStr (SOURCESTRING)
{ 目的 : 反转一个字符串
{===============================================================}
{===============================================================}
{ 函数 : RESULTSTRING = UniCode2Gb (SOURCESTRING)
{ 目的 : 将UniCode字符串转换为GB
{===============================================================}
{===============================================================}
{ 函数 : RESULTSTRING = GB2UniCode (SOURCESTRING)
{ 目的 : 将GB字符串转换为UniCode
{===============================================================}
unit BinHexTools;
interface
function HexToBin(HexNr: string): string;
function HexCharToInt(HexToken: char): Integer;
function HexCharToBin(HexToken: char): string;
function pow(base, power: integer): integer;
function BinStrToInt(BinStr: string): Integer;
function DecodeSMS7Bit(PDU: string): string;
function ReverseStr(SourceStr: string): string;
function GB2UniCode(GB: string): string;
function UniCode2GB(S: string): string;
implementation
uses sysutils, dialogs;
function HexCharToInt(HexToken: char): Integer;
begin
//if HexToken>#97 then HexToken:=Chr(Ord(HexToken)-32);
{ 将小写字母转换成大写 }
Result := 0;
if (HexToken > #47) and (HexToken < #58) then { chars 0....9 }
Result := Ord(HexToken) - 48
else if (HexToken > #64) and (HexToken < #71) then { chars A....F }
Result := Ord(HexToken) - 65 + 10;
end;
function HexCharToBin(HexToken: char): string;
var DivLeft: integer;
begin
DivLeft := HexCharToInt(HexToken); { first HexChar->Int }
Result := '';
{ Use reverse dividing }
repeat { Trick; divide by 2 }
if Odd(DivLeft) then { result = odd ? then bit = 1 }
Result := '1' + Result { result = even ? then bit = 0 }
else
Result := '0' + Result;
DivLeft := DivLeft div 2; { keep dividing till 0 left and length = 4 }
until (DivLeft = 0) and (length(Result) = 4); { 1 token = nibble = 4 bits }
end;
function HexToBin(HexNr: string): string;
{ only stringsize is limit of binnr }
var Counter: integer;
begin
Result := '';
for Counter := 1 to length(HexNr) do
Result := Result + HexCharToBin(HexNr[Counter]);
end;
function pow(base, power: integer): integer; //指数base^power
var counter: integer;
begin
Result := 1;
for counter := 1 to power do
Result := Result * base;
end;
function BinStrToInt(BinStr: string): integer;
var counter: integer;
begin
if length(BinStr) > 16 then
raise ERangeError.Create(#13 + BinStr + #13 +
'不是一个有效的16Bit二进制单元' + #13);
Result := 0;
for counter := 1 to length(BinStr) do
if BinStr[Counter] = '1' then
Result := Result + pow(2, length(BinStr) - counter);
end;
function DecodeSMS7Bit(PDU: string): string;
var OctetStr: string;
OctetBin: string;
Charbin: string;
PrevOctet: string;
Counter: integer;
Counter2: integer;
begin
PrevOctet := '';
Result := '';
for Counter := 1 to length(PDU) do
begin
if length(PrevOctet) >= 7 then { if 7 Bit overflow on previous }
begin
if BinStrToInt(PrevOctet) <> 0 then
Result := Result + Chr(BinStrToInt(PrevOctet))
else Result := Result + ' ';
PrevOctet := '';
end;
if Odd(Counter) then { only take two nibbles at a time }
begin
OctetStr := Copy(PDU, Counter, 2);
OctetBin := HexToBin(OctetStr);
Charbin := '';
for Counter2 := 1 to length(PrevOctet) do
Charbin := Charbin + PrevOctet[Counter2];
for Counter2 := 1 to 7 - length(PrevOctet) do
Charbin := OctetBin[8 - Counter2 + 1] + Charbin;
if BinStrToInt(Charbin) <> 0 then Result := Result + Chr(BinStrToInt(CharBin))
else Result := Result + ' ';
PrevOctet := Copy(OctetBin, 1, length(PrevOctet) + 1);
end;
end;
end;
function ReverseStr(SourceStr: string): string;
var Counter: integer;
begin
Result := '';
for Counter := 1 to length(SourceStr) do
Result := SourceStr[Counter] + Result;
end;
function GB2UniCode(GB: string): string;
var
s: string;
i, j, k: integer;
a: array[1..160] of char;
begin
s := '';
StringToWideChar(GB, @(a[1]), 500);
i := 1;
while ((a[i] <> #0) or (a[i + 1] <> #0)) do begin
j := Integer(a[i]);
k := Integer(a[i + 1]);
s := s + Copy(Format('%X ', [k * $100 + j + $10000]), 2, 4);
//S := S + Char(k)+Char(j);
i := i + 2;
end;
Result := s;
end;
function UniCode2GB(S: string): string;
var I: Integer;
begin
I := Length(S);
while I >= 4 do begin
try
Result := WideChar(StrToInt('$' + S[I - 3] + S[I - 2] + S[I - 1] + S[I])) + Result;
except end;
I := I - 4;
end;
end;
end.
Delphi的unicode与GB2312转转换, 汉字unicode转GB2312
转载上一篇:Service管理
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Android GB28181-2022 图像抓拍
新版国标-2022增加了图像抓拍功能,本文详细的说明了Android设备端如何支持图像抓拍。
安卓国标2022图像抓拍 Android GB28181 2022 安卓GB28181 2022图像抓拍 Android GB28181 2022 GB28181 2022图像抓拍 -
GB2312,GBK,Unicode
各个不同厂商 Read More
ico 3c i++ 码表 16进制 -
spark分批写入mysql数据量大
文章目录RDD持久化向HDFS写数据向MySql写数据RDD缓存缓存的存储级别StorageLevelcache()和persist()的区别是什么?缓存什么时候失效?RDD.cache后是否真正缓存? RDD持久化向HDFS写数据向HDFS写数据时,当前RDD的分区即为HDFS上的文件数。 为避免生成多个小文件,可以先重分区。rdd.repartition(4).saveAsTextFile(
spark分批写入mysql数据量大 cache presist unpersist foreachPartition