- 浏览: 327681 次
最新评论
-
riki:
D 语言学习交流群 264617728, 欢迎加入
D语言真相 The Case for D(1-5) -
exploder:
请教,如果使用D2进行wxD编译呢?
编译WxD0.16 -
blue_halo:
那如何解决呢????????
不能每次都用别的打开存成utf- ...
pyDev 中输入中文问题 -
funxue:
请教楼主
Error: undefined identifie ...
D语言版本的华容道 -
litsen:
在配置ms sqlserver的过程中遇到些问题,从Googl ...
安全第一,在sql server和client之间配置ssl连接
每个使用C或者C++直到D的人都要认识到的Unicode问题:
如果你的程序要在更广的国度使用,或者要进入Internet,你都要使用Unicode!
先列个提纲,细节解释待续!
1.编码 ansi,mbcs/dbcs,unicode,ucs2
2.类型 ansi char ,utf8 char,wchar,dchar
3.类型的指针和内存复制
4.windows的知识
windwos98,2000,windowsCE
D代码
- public import std.c.string;
- public import std.string;
- public import std.utf;
- //win32
- import win32.windows;
- template zstr(T)
- {
- T[] zstr(T[] chars)
- {
- uint l = chars.length;
- chars.length = l + 1;
- chars[l] = 0;
- return chars;
- }
- }
- char[] w2a( wchar[] w ) { return toUTF8(w); }
- char[] w2az( wchar[] w ) { return zstr!(char)(w2a(w)); }
- char[] wz2a( wchar* w ) { return toUTF8( wz2w(w) ); }
- char[] wz2az( wchar* w ) { return zstr!(char)(wz2a(w)); }
- wchar[] a2w( char[] a ) { return toUTF16(a); }
- wchar[] a2wz( char[] a ) { return zstr!(wchar)(a2w(a)); }
- wchar[] az2w( char* a ) { return toUTF16( az2a(a) ); }
- wchar[] az2wz( char* a ) { return zstr!(wchar)(az2w(a)); }
- wchar[] wz2w( wchar* w ) { return w? w[0..wcslen(w)]: null; }
- char[] az2a( char* a ) { return a? a[0..strlen(a)]: null; }
- wchar[] w2wz( wchar[] w ) { return zstr!(wchar)(w); }
- char[] a2az( char[] a ) { return zstr!(char)(a); }
- const uint CP_ACP = 0; /* default to ANSI code page */
- const uint CP_OEMCP = 1; /* default to OEM code page */
- // wchar[] to multibyte string, zero terminated
- char[] wcs2mbz(wchar[] ws)
- {
- uint codepage = CP_OEMCP; //2000/+
- char[] rz;
- rz.length = WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, null, 0, null, null) + 1;
- WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, rz.ptr, rz.length, null, null);
- rz[rz.length-1] = 0;
- rz.length = rz.length-1;
- return rz;
- }
- // multibyte string to wide string
- wchar[] mbz2wcs(char[] s)
- {
- uint codepage = CP_OEMCP; //2000/+
- wchar[] rz;
- rz.length = MultiByteToWideChar(codepage, 0, s.ptr, s.length, null, 0) + 1;
- MultiByteToWideChar(codepage, 0, s.ptr, s.length, rz.ptr, rz.length);
- rz[rz.length-1] = 0;
- rz.length = rz.length-1;
- return rz;
- }
- void main()
- {
- char[] ctext,ccaption;
- wchar[] wtext,wcaption;
- wcaption="中文软件a1A";
- ccaption="中文软件a1A";
- wtext="1.unicode的windows函数 调用宽字符:直接转换为0结尾的字符串,";
- MessageBoxW(null, w2wz(wtext).ptr, w2wz(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- ctext="2.unicode的windows函数 调用普通字符:转换utf16的0结尾的字符串,";
- MessageBoxW(null, a2wz(ctext).ptr, a2wz(ccaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- wtext="3.ANSI的windows函数 调用宽字符:转换为toUTF8的0结尾的字符串,标题乱码,";
- MessageBoxA(null, wcs2mbz(wtext).ptr, w2az(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- wtext="4.ANSI的windows函数 调用宽字符:用WideCharToMultiByte转换为0结尾的ANSI字符串,";
- MessageBoxA(null, wcs2mbz(wtext).ptr, wcs2mbz(wcaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- ctext="5.ANSI的windows函数 调用普通字符:用WideCharToMultiByte转换为0结尾的ANSI字符串,标题乱码.";
- //// convert UTF-8 to MBCS
- MessageBoxA(null, wcs2mbz(a2w(ctext)).ptr, a2az(ccaption).ptr, MB_OK | MB_ICONEXCLAMATION);
- }
- /*
- 1.调用ANSI函数
- 2.调用Unicode函数
- 3.函数返回值,分配内存:
- 4.调用要使用字符数量:chars.sizeof/wchar.sizeof =chars.length
- */
评论
16 楼
oldrev
2007-09-03
用单元测试来保证质量,D的风险应该不算大
15 楼
redsea
2007-09-03
>BTW:现在用D来进行实际开发,似乎太过于冒险了吧。
不再弄 g++ 了, 编译时间都是浪费生命.
反正现在写的程序有 process monitor, 一旦工作不正常, 就杀掉重启, 问题不大.
不再弄 g++ 了, 编译时间都是浪费生命.
反正现在写的程序有 process monitor, 一旦工作不正常, 就杀掉重启, 问题不大.
14 楼
Colorful
2007-09-03
BTW:现在用D来进行实际开发,似乎太过于冒险了吧。
13 楼
Colorful
2007-09-02
@redsea
简单的说,在D 2.0中string的出现,对char[]的使用影响极大。
对于字符串常量来说,几乎没有了char[]的用武之地。
对于char[] str1 = "A"等之类的用法被完全拒绝。
在D 2.0中char[]跟其他类型动态数组的使用一致起来。
如果你对D语言数组的内存分配方式很了解的话,这些都不是问题。
麻烦的是那一大堆编译器错误的处理。
如果不了解其内存分配方式,建议还是统一使用string来的方便和安全。
如果要兼容D 1.0,可以使用version(...)来处理。
比如
简单的说,在D 2.0中string的出现,对char[]的使用影响极大。
对于字符串常量来说,几乎没有了char[]的用武之地。
对于char[] str1 = "A"等之类的用法被完全拒绝。
在D 2.0中char[]跟其他类型动态数组的使用一致起来。
如果你对D语言数组的内存分配方式很了解的话,这些都不是问题。
麻烦的是那一大堆编译器错误的处理。
如果不了解其内存分配方式,建议还是统一使用string来的方便和安全。
如果要兼容D 1.0,可以使用version(...)来处理。
比如
version(1.0) { alias char[] String; //String是临时起的 :) } else { alias string String; }
12 楼
redsea
2007-09-02
to: Colorful
你直接告诉我吧
我通过 dsss 使用 dmd 1.018 和 tango, D2.0 和 phobos 都没有研究.
我现在是将 D 用在实际开发中了.
你直接告诉我吧
我通过 dsss 使用 dmd 1.018 和 tango, D2.0 和 phobos 都没有研究.
我现在是将 D 用在实际开发中了.
11 楼
Colorful
2007-09-01
@redsea
你可以试验一下下面的代码:
你可以试验一下下面的代码:
import std.stdio; void main() { char[1] a = "A"; writefln(a.ptr); char[] b = a; writefln(b.ptr); string c = a; writefln(c.ptr); writefln(); string d = "B"; writefln(d.ptr); string e = d; writefln(e.ptr); char[1] f= d; writefln(f.ptr); }
10 楼
redsea
2007-09-01
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
那不影响我们直接用 char[] 吧 ?
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
那不影响我们直接用 char[] 吧 ?
9 楼
oldrev
2007-09-01
2.0的 constness 这个比 C++ 的还要复杂。
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
D2.0 似乎 string 是 alias const(char)[] string; 吧
也就是跟 C#/Java 的 string 一样,字符串内容不可变。
8 楼
ideage
2007-09-01
还没有有用过2.0呢,
7 楼
Colorful
2007-09-01
郁闷,上面的代码不能在D 2.0下通过编译。
char[] -> string
wchar[] -> wstring
要修改的地方太多了,懒得改了,呵呵。
char[] -> string
wchar[] -> wstring
要修改的地方太多了,懒得改了,呵呵。
6 楼
ideage
2007-09-01
引用
其实没这么复杂,D程序内部全用UTF-8,与 Windows API 交互时 toUTF16,*nix 系统基本上都完全支持UTF-8。
举双手赞成!
应该建议所有的D开发者,使用unicode,可惜DFL还想支持win9x。
5 楼
Colorful
2007-09-01
比如Windows CE直接放弃了以A结尾的API。
Unicode是王道。
:)
Unicode是王道。
:)
4 楼
Colorful
2007-09-01
MBCS的确应该淘汰了,Win9x也太古老了,呵呵。
3 楼
Colorful
2007-09-01
我觉得把char类型直接改成16位的Unicode字符就很好,呵呵。
我如果使用D来开发,就完全采用wstring,只有在必要时,比如网络传输,才使用UTF8编码,因为这个时候很少使用除英文之外的其他语言。
可惜的是,Object,Exception等都采用的string.当要给系统API传递时,还要进行转换。
我如果使用D来开发,就完全采用wstring,只有在必要时,比如网络传输,才使用UTF8编码,因为这个时候很少使用除英文之外的其他语言。
可惜的是,Object,Exception等都采用的string.当要给系统API传递时,还要进行转换。
2 楼
sofire
2007-09-01
在Linux,不知道能不能通过 环境变量,输出UTF8或者GB2312?
1 楼
oldrev
2007-09-01
其实没这么复杂,D程序内部全用UTF-8,与 Windows API 交互时 toUTF16,*nix 系统基本上都完全支持UTF-8。需要实现快速的字符处理时转换为dchar。
至于其他什么 MBCS 之类就不用考虑了,现在已经没必要支持 Win9x。
至于其他什么 MBCS 之类就不用考虑了,现在已经没必要支持 Win9x。
发表评论
-
最近抽空翻译了D语言实用入门教程
2018-04-20 10:42 904最近抽空翻译了D语言实用入门教程 地址在Github,供初 ... -
编译WxD0.16
2011-09-27 18:09 1727wx我在Python环境下用了 ... -
简单看了下DGui
2011-09-26 10:39 2283很久没有写代码了。。。。 怀念往日不如今天行动。生疏了 ... -
支持中文录入的harmonia
2010-08-16 22:40 1046harmonia界面很方便,发现不能录入中文.Patch一下. ... -
控制台得到密码不回显
2009-09-18 22:37 1272看到坛子有人问“在D或C下如何实现输入单个字符不回显?可能的应 ... -
D资源文件调用
2009-08-09 01:36 1063终于成功了。 资源文件太可爱,竟然可以如此。按名称进行 ... -
The Case for D中英文版PDF下载
2009-06-19 10:27 1412The Case for D 在网站上浏览不方便的,有了PD ... -
D语言真相 The Case for D(1-5)
2009-06-17 09:52 4919D语言真相 Andrei Alexandre ... -
The Case for D
2009-06-16 22:50 2315The Case for D Andrei Alexan ... -
Python嵌入D
2009-06-12 11:37 1988所有的嵌入都研究了一个遍。发现嵌入Python挺好,试试。 ... -
实用的DFL注册表
2009-05-27 09:09 1031应用中要用到注册表.DFL里面有. 参照了文档,写了一 ... -
DFL 2.027,1.041,2,3编译
2009-04-07 17:59 1609注:DFL已经更新,http://www.dprogrammi ... -
D2.0的字符串
2009-04-07 08:28 1390D2.0的字符串增加了常量,不变量和变量.在很大程度上增加了语 ... -
D语言编译器DMD开源了!
2009-03-05 19:56 3503自从1999年12月,Walter设计开发D语言以来,D语 ... -
D语言现状From2007
2009-03-02 15:32 1074I'm sure this was brought up in ... -
D语言GUI库简单比较
2009-02-20 15:25 3259通过对一些D语言可以使用的GUI进行比较,对初学者有个借 ... -
D语言脚本引擎简单比较
2009-02-19 14:38 1833经过长期的测试,使用,扩展代码编写,比较了D中可以使用的几种脚 ... -
D语言编译器开始支持Mac OSX
2009-02-15 18:25 1176D语言编译器开始支持Mac OSX。 D语言历经10年的发 ... -
触发DFL中的ComboBox控件的键盘事件
2009-02-06 12:04 1205class ComboxKeyDownFilter:IMess ... -
DFL分析(四)伟大的结构
2008-12-25 00:08 1430每个程序都有很多的代码编织而成.为了获得最大的兼容性,你要从容 ...
相关推荐
在易语言中进行Ansi到Unicode或Unicode到Ansi的转换,主要是为了处理不同编码间的兼容性和数据交换。转换源码可能涉及以下关键步骤: 1. **读取Ansi文本**:首先,你需要读取存储为Ansi格式的文本文件,这通常通过...
易语言Ansi与Unicode转换源码,Ansi与Unicode转换,AnsiToUnicode,UnicodeToAnsi,AnsiToUnicode2,UnicodeToAnsi2,RtlAnsiStringToUnicodeString,RtlUnicodeStringToAnsiString,RtlFreeUnicodeString,RtlFreeAnsiString...
就是Unicode和ANSI码的对照文件。 四个文本,两个程序。 文本Unicode是Unicode表 Unicode2ANSI是Unicode文本另存为ANSI unicodeandANSI.txt是对照表的Unicode版本 unicodeandANSI2ANSI.txt是对照表的ANSI版本 有些...
ANSI编码和Unicode编码是两种常见的字符编码标准,它们各自有不同的特点和应用场景。本文将详细介绍这两种编码的区别以及如何在Windows操作系统下进行转换。 首先,ANSI编码,也称为Windows默认的多语言编码或代码...
本工具专注于ANSI和UNICODE字符串与十六进制之间的转换,这涉及到字符编码和二进制数据的理解。 首先,我们要理解ANSI和UNICODE的概念。ANSI字符串通常指的是基于特定地区或语言的ASCII编码,它使用7位或8位来表示...
该工具的核心功能是将使用ANSI编码的文本转换成Unicode编码,从而确保在任何支持Unicode的环境中都能正确显示和处理这些文本。它的版本号1.0.3表明这是一个较为成熟的版本,经过了多次迭代和优化,应该具有较高的...
例如,`MultiByteToWideChar`和`WideCharToMultiByte`函数可以分别用于ANSI到Unicode和Unicode到ANSI的转换。在MFC项目中使用这些函数,需要确保项目的字符集设置正确,通常设置为“多字节字符集”以便处理ANSI编码...
在 Windows 操作系统中,常见的字符串编码方式有三种:Ansi、Unicode 和 UTF8。今天我们将详细介绍这三种编码方式之间的转换,包括 Ansi 转 Unicode、Unicode 转 Ansi,以及使用 wprintf 函数进行字符串输出。 Ansi...
ANSI和Unicode是两种常见的字符编码标准,它们在处理不同语言的文本时起着关键作用。本文将深入探讨ANSI和Unicode的区别,以及如何在C++中使用MFC库实现它们之间的转换。 首先,让我们了解ANSI和Unicode的基本概念...
base64 加密和解密,encode、decode,包括 Ansi 和 Unicode。
ANSI和Unicode是两种常见的字符编码标准,它们各自有其特性和适用场景。本文将深入探讨“文本转码 ANSI转Unicode”这一主题,特别是针对C#编程语言的实现方法。 首先,我们需要了解ANSI编码。ANSI编码并非一个严格...
Ansi转Unicode.exe编程的朋友会用到.
在易语言中,涉及到字符编码的问题时,我们通常会遇到Ansi和Unicode这两种不同的字符编码方式。 Ansi编码,也称为本地代码页或MBCS(多字节字符集),是基于特定区域设置的编码系统。在Windows系统中,Ansi编码通常...
在编程领域,Ansi和Unicode是两种不同的字符编码标准,它们在处理文本数据时有着显著的区别。本资源“Ansi与Unicode转换.rar”显然包含了关于这两种编码之间转换的易语言源代码,这对于学习和理解字符编码转换机制...
utf-8、ANSI、Unicode相互转化c++实现 std::string ConverANSI2UTF8(const std::string & str); std::wstring ConverANSI2Unicode(const std::string str); std::wstring ConverUTF82Unicode(const std::string str)...
使用“ansi2unicode批量转换软件”这样的工具,可以方便地解决这些问题,确保数据的完整性和一致性。对于那些需要处理多语言内容的开发者和企业来说,这款工具是一个非常实用的助手。 总的来说,ansi2unicode批量...
将ANSI文本文件转换为Unicode格式是编程和文件处理中常见的需求,尤其是在处理包含多语言或特殊字符的数据时。在给定的文件信息中,提到了几种不同的方法和过程,包括`TGBUCS.GB_USC2`、`TopAnsiToUTF8`、`UTF8To...
"CharsetConv"类提供了一个工具,帮助开发者在ANSI、Unicode(Little Endian和Big Endian)、UTF-8及UTF-8+BOM之间灵活转换,从而避免编码问题带来的困扰。通过深入学习和实践,开发者可以更好地应对各种编码挑战,...
ANSI --> Unicode ANSI --> Unicode big endian ANSI --> UTF-8 Unicode --> ANSI Unicode --> UTF-8 UTF-8 --> ANSI UTF-8 --> Unicode UTF-8 --> Unicode big endian ansi转别的,不检验BOM,一律作为ansi编码...
批量转换文本编码的软件///////////////////////