DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wjy13061029975
今日帖子: 2
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jihjun (jih) ★☆☆☆☆ -
普通会员
2021/6/23 19:48:21
标题:
英文OS內的中文亂碼 浏览:1972
加入我的收藏
楼主: 1:環境英文版win10
2:問題:將一個UTF8的中文文件,轉成ASCII後存成ANSI檔。。

可是,在自已(中文WIN10)跑起來都是正常,也都是ANSI檔,但是在客戶端時,就沒法存成中文的ANSI檔,再怎麼存都是UTF8,且內文也都是亂碼(檔案COPY回中文WIN10內查看)。。。

搞到快瘋了,請教各位大大有解嗎?
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/6/23 20:34:54
1楼: TStringList.LoadFromFile('...', TEncoding.UTF8);
TStringList.SaveToFile('...', TEncoding.ANSI);
----------------------------------------------
武汉天气不好
作者:
男 jihjun (jih) ★☆☆☆☆ -
普通会员
2021/6/23 22:20:14
2楼: 感謝您
TStringList.LoadFromFile('...', TEncoding.UTF8);
TStringList.SaveToFile('...', TEncoding.ANSI);
這方式在中文win10 內存檔是正確的。
但是在客戶英文win10 存檔,一樣是UTF8。。。
delphi 版本是 10.4.2
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2021/6/23 22:22:56
2楼: 1楼的代码在纯英文系统下并不能达到预期目的,因为英文系统中默认代码页不是中文,所以转换出来的结果不对,必须用以下代码才可以:
procedure ConvertUTF8ToAnsi(const ASourceFile, ATargetFile: string);
var
  encoding: TMBCSEncoding;
begin
  encoding := TMBCSEncoding.Create(950); //950繁体中文,936简体中文
  try
    with TStringList.Create do try
      LoadFromFile(ASourceFile, TEncoding.UTF8);
      SaveToFile(ATargetFile, encoding);
    finally
      Free;
    end;
  finally
    encoding.Free;
  end;
end;
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2021/6/23 23:04:21
3楼: unicode -> ansi -> unicode 转化,由于转换平面不完全匹配会导致某些内容丢失;早在 ansi 的 delphi 时代,如:

a1, a2: ansistring;
w: widestring;

a1 := ...
w := a1;
a2 := w;

就会有可能 a1 <> a2 !
----------------------------------------------
-
作者:
男 jihjun (jih) ★☆☆☆☆ -
普通会员
2021/6/23 23:30:24
4楼: 還有一個問題
a1 : String ;
a2 : ansiString ;
a1 := '中文 ;
a2 := AnsiString(a1) ;

在中文win10 a2='中文',可以正常轉換,但是 在英文win10 ,a2='??'....
即使將a2寫入檔案,在中文win10內查詢瀏覽,一樣是??
但是 一樣的程式,在中文win10 內都是正常,寫入也正常....
真的快被搞瘋了
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2021/6/23 23:37:06
5楼: 在英文系统转换中文必须指定代码页!否则转换会出错,因为你这样写用的是默认代码页,英文系统下默认代码页不是中文。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 jihjun (jih) ★☆☆☆☆ -
普通会员
2021/6/23 23:40:50
6楼: 可否請大大教導一下
a1 : String ;
a2 : ansiString ;
a1 := '中文 ;
a2 := AnsiString(a1) ;

這樣的轉換,用甚麼方式可以指定 "代碼頁"

感激~~~~
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/6/24 8:51:13
7楼: ansistring(936);
大约是这样 。
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2021/6/24 9:23:23
8楼: 简单起见是用SetAnsiString(@a2, PChar(a1), Length(a1), 936),当然也可以直接用Windows API WideCharToMultiByte。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 wg961423 (麦子仲肥) ★☆☆☆☆ -
盒子活跃会员
2021/6/24 9:42:37
9楼: 统一用UTF8不就好了
----------------------------------------------
-
作者:
男 littlestone08 (littlestone08) ★☆☆☆☆ -
普通会员
2021/7/22 17:36:57
10楼: 楼主最终用的哪个方法呢?
----------------------------------------------
我和我追逐的梦,擦肩而过
作者:
男 hi100 (hi100) ▲▲▲▲△ -
普通会员
2021/7/23 11:29:20
11楼: 试试这个:
type
  TLanguage = (tNone,tEnglish,tGBChs,tBig5,tGBCht);

var
  Map: array[1..13468] of array[1..2] of integer;

function FindBig5(ACodeValue: Integer): string;
var
  a, b, i, m, j: Integer;
  F: Boolean;
  c1, c2: Char;
begin
  a := 0;
  b := 13468;
  i := (a + b) shr 1;
  F := False;
  m := 0;
  while not F do
  begin
    m := Map[i][1];
    if ACodeValue = m then
    begin
      F := True;
      m := Map[i][2];
      for j := i downto 0 do
      begin
        if Map[j][1] = ACodeValue then
          m := Map[j][2]
        else
          break;
      end;

      Break;
    end else
    if ACodeValue > m then
    begin
      a := i + 1;
    end else
    begin
      b := i - 1;
    end;

    i := (a + b) shr 1;

    if a > b then Break;
  end;
  if not F then
    m := ACodeValue;

  c1 := chr(m shr 8);
  c2 := chr(m mod 256);

  Result := c1 + c2;
end;

function L_(AChsStr: string): string;
var
  i: Integer;
  c1, c2, c3: Integer;
begin
  Result := '';
  c2 := 0;
  for i := 1 to Length(AChsStr) do
  begin
    c1 := ord(AChsStr[i]);
    if c2 <> 0 then
    begin
      c3 := (c2 shl 8) + c1;
      Result := Result + FindBig5(c3);
      c2 := 0;
    end else
    if c1 >= 128 then
    begin
      c2 := c1;
    end else
    begin
      Result := Result + AChsStr[i];
    end;
  end;
end;

//获取操作系统默认语言
// -1、无效 0、英语 1、简体中文 3、繁体中文
function GetSysDefaultLg: TLanguage;
var
  LangID: Integer;
begin
  Result := tNone;
  LangID := GetSystemDefaultLangID;
  if LangID = ((SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH) then
    Result := tEnglish //美国英语
  else if LangID = ((SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE) then
    Result := tGBChs //简体中文
  else if LangID = ((SUBLANG_CHINESE_TRADITIONAL shl 10) or LANG_CHINESE) then
    Result := tBig5; //繁体中文
end;

调用方法:
Label1.Caption := L_('注册名称');
----------------------------------------------
-
作者:
男 hi100 (hi100) ▲▲▲▲△ -
普通会员
2021/7/23 11:31:19
12楼: 看错了,以为是简繁体的问题,不过代码也放在这里吧,希望能帮到有需要的人
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行68.35938毫秒 RSS