Windows编程中宽字符处理与常见问题
- 格式:doc
- 大小:59.50 KB
- 文档页数:14
代码调试中的常见问题与解决方法代码调试是程序开发过程中一个非常重要的环节,但常常会遇到各种问题,导致开发进度延误。
下面将介绍一些常见的代码调试问题及解决方法,希望对大家有所帮助。
1.语法错误语法错误是最为常见的问题之一,如果代码中存在语法错误,程序将无法正常运行。
通常会出现拼写错误、缺少分号等问题。
在这种情况下,编译器会给出相应的错误提示,如缺少分号、拼写错误等信息。
解决方法是仔细检查代码,对照错误信息进行修改。
2.逻辑错误逻辑错误是指程序逻辑上的错误,导致程序无法按照预期的方式运行。
有时候程序可以正常编译并且运行,但是结果却不正确。
这种情况下,需要通过调试工具进行逐步调试,找出程序逻辑上的错误,并进行修正。
3.内存泄漏内存泄漏是指程序在运行过程中分配了内存空间但没有及时释放,导致内存占用不断增加,最终导致程序崩溃。
通常情况下,内存泄漏会导致程序变得越来越慢,直至最终崩溃。
可以通过内存调试工具检测内存泄漏问题,并进行相应的修复。
4.程序崩溃程序崩溃是指程序在运行过程中突然停止工作的现象,通常会出现错误提示。
常见的程序崩溃原因包括访问非法内存、栈溢出等。
解决方法是通过调试工具跟踪程序执行过程,找出程序崩溃的原因,并进行相应的修复。
5.性能问题性能问题是指程序在运行过程中性能较差,例如运行速度慢、资源占用高等。
通常情况下,性能问题会导致程序体验不佳,甚至影响用户体验。
可以通过性能分析工具进行性能测试,找出性能瓶颈并进行优化。
6.死锁问题死锁是指两个或多个进程在执行过程中,由于竞争资源导致相互等待,进而导致程序无法继续执行的情况。
通常情况下,死锁问题很难排查,需要通过调试工具进行分析,找出死锁的原因,并进行相应的处理。
总的来说,代码调试是程序开发过程中不可或缺的一部分,但也是一个复杂而繁琐的工作。
在遇到问题时,我们应该耐心、细心地进行排查,并利用各种调试工具来帮助我们解决问题。
只有不断提升自己的调试技能,才能更好地完成程序开发工作。
常见编码错误:如何避免和修复编码错误是编程过程中常见且容易出现的问题。
它们经常导致程序运行不正确或输出错误的结果。
为了避免和修复这些错误,我们需要在编写代码时采取一些注意事项和解决方法。
下面是我列举的一些常见编码错误,以及如何避免和修复它们。
1.语法错误语法错误是最常见的编码错误之一。
它们通常是由于拼写错误、缺少或多余的符号或括号造成的。
为了避免语法错误,我们应该养成良好的编码习惯,注意拼写和符号的正确使用。
当程序出现语法错误时,编译器或解释器通常会给出错误提示信息,我们可以根据提示信息来修复错误。
2.运行时错误运行时错误是程序在运行时发生的错误。
它们通常是由于数据类型不匹配、数组越界、除零错误等导致的。
为了避免运行时错误,我们应该在使用变量或数据之前进行合适的类型检查或边界检查。
此外,我们还可以使用异常处理机制来处理运行时错误,以确保程序的稳定性。
3.逻辑错误逻辑错误是程序中最难以察觉和修复的错误之一。
它们通常是由于设计或实现中的错误逻辑导致的。
为了避免逻辑错误,我们应该养成良好的设计和分析习惯,在编写代码之前仔细思考和规划。
此外,我们还可以使用调试工具来帮助我们找到和修复逻辑错误。
4.内存泄漏内存泄漏是指在程序中动态分配的内存没有及时释放,导致内存占用不断增加的情况。
为了避免内存泄漏,我们应该在程序适当的地方释放不再需要的内存,特别是在使用动态内存分配函数(如malloc、new等)分配内存时。
此外,我们还可以使用内存管理工具来检测和修复内存泄漏问题。
5.死锁死锁是多线程程序中常见的问题。
它们通常是由于线程之间的竞争和资源分配不当导致的。
为了避免死锁,我们应该在设计和实现并发程序时遵循良好的并发控制原则。
特别是在使用锁时,要避免出现死锁的情况。
此外,我们还可以使用调试工具来分析和解决死锁问题。
6.输入错误输入错误是编程过程中常见的错误之一。
它们通常是由于用户输入不正确或输入格式不符合要求导致的。
Windows程序中的字符编码写这篇文章的起因是这么一个问题:我们在使用和安装Windows程序时,有时会看到以“2052”、“1033”这些数字为名的文件夹,这些数字似乎和字符集有关,但它们究竟是什么意思呢?研究这个问题的同时,又会遇到其它问题。
我们会谈到Windows的内部架构、Win32 API的A/W函数、Locale、ANSI代码页、与字符编码有关的编译参数、MBCS和Unicode程序、资源和乱码等,一起经历这段琐碎细节为主,间或乐趣点缀的旅程。
0 Where is Win32 APIWindows 程序有用户态和核心态的说法。
在32位地址空间中,0x80000000以下属于用户态,0x80000000以上属于核心态。
所有硬件管理都在核心态。
用户态程序的不能直接使用核心态的任何代码。
所谓核心态其实只是CPU的一种保护模式。
在x86 CPU上,用户态处于ring 3,核心态处于ring 0。
从用户态进入核心态的最常用的方法是在寄存器eax填一个功能码,然后执行int 2e。
这有点像DOS时代的DOS和BIOS系统调用。
在NT架构中这种机制被称作system service。
在核心态提供system service的有两个家伙:ntoskrnl.exe和win32k.sys。
ntoskrnl.exe是Windows的大脑,它的上层被称为Executive,下层被称作Kernel。
Win32k.sys提供与显示有关的system service。
在用户态一侧,有一个重要的角色叫作ntdll.dll,大多数system service都是它调用的。
它封装这些system service,然后提供一个API接口。
这个接口被称作native API。
native API的用户是各个子系统(subsystem),包括Win32子系统、OS/2子系统、POSIX子系统。
各个子系统为Win32、OS2、POSIX程序提供了运行平台。
避免常见错误的Windows CMD命令使用注意事项Windows命令提示符(CMD)是Windows操作系统中一个强大的工具,它可以让用户通过命令行界面来执行各种操作。
然而,由于CMD命令的复杂性和灵活性,使用时容易出现一些常见的错误。
本文将介绍一些常见的错误以及如何避免它们。
1. 输入错误的命令在CMD中,一个常见的错误是输入错误的命令。
由于CMD命令是大小写敏感的,所以输入错误的大小写可能导致命令无法正常执行。
此外,输入错误的命令也可能是因为拼写错误或者不熟悉命令的正确语法。
为了避免这个错误,建议在使用CMD命令之前,先查阅相关的文档或者使用命令的帮助功能。
CMD提供了/help参数,可以查看命令的用法和示例。
此外,使用Tab键可以自动补全命令,减少拼写错误的可能性。
2. 忽略命令参数许多CMD命令都需要指定一些参数来执行特定的操作。
忽略这些参数可能导致命令无法按预期工作。
为了避免这个错误,建议在使用CMD命令时,仔细阅读命令的文档或者使用/help参数来了解命令所需的参数。
在输入命令时,确保正确地指定了所有必需的参数,并按照正确的顺序输入。
3. 引号使用错误在CMD命令中,引号是用来标识字符串的起始和结束的。
然而,引号的使用往往容易出错。
一种常见的错误是忘记在字符串的起始和结束处使用引号,导致命令无法正常解析字符串。
为了避免这个错误,建议在使用CMD命令时,始终使用引号将字符串括起来。
即使字符串中没有空格或特殊字符,也应该使用引号,以防止意外的错误发生。
4. 忘记转义字符在CMD命令中,某些特殊字符具有特殊的含义,例如管道符(|)和重定向符(>)。
如果忘记使用转义字符来转义这些特殊字符,可能会导致命令无法按预期工作。
为了避免这个错误,建议在使用CMD命令时,了解哪些字符是特殊字符,并正确地使用转义字符来转义它们。
CMD使用的转义字符是“^”,例如,要在命令中使用管道符,可以使用“^|”来转义它。
编程中的常见问题与解决方案在编程过程中,常常会遇到各种各样的问题。
有些问题会困扰我们很长时间,甚至让我们陷入绝望。
然而,对于大多数问题来说,总会有解决方案。
本文将介绍一些编程中常见的问题,并提供相应的解决方案,希望对读者有所帮助。
一、语法错误语法错误是编程中最常见的问题之一。
当我们编写代码时,如果不小心遗漏了一个分号、括号不匹配或者使用了错误的语法结构,编译器就会提示错误信息。
解决语法错误的方法是仔细检查代码,并使用编程工具提供的自动补全和语法检查功能。
二、逻辑错误逻辑错误是指代码中的错误逻辑导致程序运行出现问题。
这些错误可能会导致程序无法正常执行、输出结果错误或者进入死循环等情况。
解决逻辑错误的方法是仔细分析代码,检查变量的取值范围、条件判断和循环逻辑等,并使用调试工具逐行跟踪程序执行过程。
三、性能问题性能问题是指程序在执行过程中出现运行速度慢或者占用过多系统资源的情况。
这些问题可能会导致用户体验差,甚至使整个系统崩溃。
解决性能问题的方法是进行程序优化,如改进算法、减少资源占用和并发处理等。
四、内存管理问题内存管理问题是指程序中对内存的使用不当导致内存泄漏、内存溢出或者野指针等问题。
这些问题会导致程序崩溃或者数据丢失。
解决内存管理问题的方法是正确地分配和释放内存资源,避免出现内存泄漏和溢出,并使用内存管理工具进行检测和修复。
五、并发问题并发问题是指多线程或多进程程序中出现的竞态条件、死锁和资源争用等问题。
这些问题会导致程序的行为不确定,甚至使系统陷入不可用状态。
解决并发问题的方法是使用同步机制(如互斥锁、信号量),避免共享资源的冲突,并进行正确的线程/进程调度和资源管理。
六、跨平台兼容问题跨平台兼容问题是指程序在不同操作系统或硬件平台上出现的兼容性问题。
这些问题可能会导致程序无法在目标平台上正常运行或者出现功能缺失。
解决跨平台兼容问题的方法是使用经过充分测试和验证的跨平台库或框架,并进行适当的平台兼容性测试和优化。
多字节字符串与宽字符串的转换可使用C API者Win32 API.C API: mbstowcs,wcstombsWin32 API: MultiByteToWideChar, WideCharToMultiByte下面着重介绍Win32 API的用法,C API的用法较为简单可参照Win32 API。
首先是WideCharToMultiByte通常你需要配置4个参数(其他参数如是使用即可),红色标记的部分。
依次是源宽字符串,需要转换的长度(-1,则为转换整个字符串),目标多字节字符串,目标缓冲区长度。
返回值表示转换为目标多字节字符串实际需要的长度(包括结束符)。
所以通常需要调用WideCharToMultiByte两次:第一次产生目标缓冲区长度,第二次产生目标字符串,像下面这样wchar_t* wcs = L"中国,你好!I Love You!";int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs, -1, NULL, 0, NULL, NULL);char* mbs = new char[ lengthOfMbs ];WideCharToMultiByte( CP_ACP, 0, wcs, -1, mbs, lengthOfMbs, NULL, NULL);delete mbs;mbs = NULL;MultiByteToWideChar的用法类似char* mbs = "中国,你好!I Love You!";int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs, -1, NULL, 0 );wchar_t* wcs = new wchar_t[ lengthOfWcs ];MultiByteToWideChar( CP_ACP, 0, mbs, -1, wcs, lengthOfWcs );delete wcs;wcs = NULL;下面两个函数封装了转换过程#include <Windows.h>#include <string>std::string WcsToMbs( const std::wstring& wcs ) {int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, NULL, 0, NULL, NULL);char* mbs = new char[ lengthOfMbs ];WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, mbs, lengthOfMbs, NULL, NULL);std::string result = mbs;delete mbs;mbs = NULL;return result;}std::wstring MbsToWcs( const std::string& mbs ) {int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, NULL, 0 );wchar_t* wcs = new wchar_t[ lengthOfWcs ];MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, wcs, lengthOfWcs );std::wstring result = wcs;delete wcs;wcs = NULL;return result;}不管什么时候,只要COM方法返回一个串,这个串都是Unicode串(这里指的是写入COM 规范的所有方法)。
计算机编程中的常见问题及解决方法让你的代码更加流畅计算机编程是一门充满挑战的艺术,无论是新手还是经验丰富的开发者,在编写代码的过程中都会遇到各种各样的问题。
这些问题可能涉及语法错误、逻辑错误、性能问题等等。
本文将探讨计算机编程中常见的问题,并提供一些解决方法,帮助你改进代码,使之更加流畅。
1. 语法错误语法错误是编程过程中最常见的问题之一。
它们通常是由拼写错误、缺少分号、括号不匹配等问题导致的。
这些错误经常导致编译器无法理解代码,从而产生错误信息。
解决方法:- 仔细检查代码中的拼写错误,确保所有变量和方法名称都正确无误。
- 确保所有的分号都已正确添加,以结束语句。
- 检查括号的使用是否正确,确保所有的括号都是成对出现的。
2. 逻辑错误逻辑错误是代码中最难发现和纠正的问题之一。
它们导致代码不按照预期的方式执行,通常会产生错误的输出或不正确的行为。
解决方法:- 通过仔细阅读代码,检查每一步的逻辑是否正确。
- 利用调试工具,在代码中插入断点,逐步执行代码并观察变量的值,以发现问题所在。
- 使用测试驱动开发的方法,编写单元测试来验证代码的逻辑准确性。
3. 性能问题性能问题是指代码的运行速度和资源利用效率低下的情况。
这些问题可能导致程序运行缓慢,响应时间长甚至崩溃。
解决方法:- 使用更高效的算法和数据结构,来减少代码的时间和空间复杂度。
- 避免不必要的循环和递归。
- 优化数据库查询,减少IO操作。
- 注意内存管理,及时释放不再使用的资源。
4. 异常处理异常处理是指在代码执行过程中遇到的错误或异常情况。
如果不正确处理异常,可能会导致程序崩溃或产生意外结果。
解决方法:- 使用try-catch语句来捕获和处理可能产生的异常。
- 在捕获异常时,提供有意义的错误信息,以便进行故障排除。
- 不要简单地将异常信息打印到控制台,而是采取适当的措施来纠正或处理异常,保证代码的健壮性。
5. 代码可读性代码可读性是指代码易于理解和维护的程度。
电脑无法将给定的窄字符串转换为宽字符串正文:当我们在处理字符串时,经常会遇到窄字符串(Narrow string)和宽字符串(Wide string)之间的转换问题。
窄字符串是指使用单字节编码(如ASCII编码)表示的字符串,而宽字符串则使用多字节编码(如UTF-16编码)表示。
在某些情况下,我们可能需要将给定的窄字符串转换为宽字符串,以便能够在宽字符环境中进行处理。
然而,有时我们可能会遇到电脑无法将给定的窄字符串成功转换为宽字符串的问题。
这种问题通常是由于以下原因之一造成的:1. 字符编码不兼容:如果给定的窄字符串使用的字符编码与当前系统或程序使用的宽字符串字符编码不兼容,那么转换就会失败。
这可能是因为窄字符串使用的是旧的ASCII编码,而宽字符串使用的是现代的Unicode编码。
2. 字符集不完整:有时,给定的窄字符串可能包含无法在宽字符串中表示的特殊字符。
这些特殊字符可能是在窄字符串编码中定义的,但在宽字符串编码中没有对应的表示方式。
3. 编码错误:在转换过程中,可能会发生编码错误,导致无法成功将窄字符串转换为宽字符串。
这可能是由于编码规则的误解或错误使用导致的。
为了解决这些问题,我们可以采取以下措施:1. 确保字符编码兼容:在进行字符串转换之前,确保给定的窄字符串和宽字符串使用的字符编码兼容。
可以通过将窄字符串转换为与宽字符串相同的编码格式,或者将宽字符串转换为与窄字符串相同的编码格式来实现兼容性。
2. 处理特殊字符:如果给定的窄字符串包含无法在宽字符串中表示的特殊字符,可以尝试使用替代字符或特殊处理方式来处理这些特殊字符。
3. 检查转换过程:在进行字符串转换时,要注意检查转换过程中是否发生了编码错误。
可以使用调试工具或日志记录来追踪转换过程,并查找可能的错误原因。
总之,电脑无法将给定的窄字符串成功转换为宽字符串可能是由于字符编码不兼容、字符集不完整或编码错误等原因造成的。
解决这些问题需要我们仔细检查字符编码兼容性、处理特殊字符,并进行错误排查。
编程中常见的算术运算符错误和解决方法在计算机编程中,算术运算符是我们常用的工具之一。
然而,由于编程的复杂性和人为的疏忽,常常会出现一些算术运算符错误。
本文将介绍一些常见的算术运算符错误,并提供相应的解决方法,帮助程序员更好地理解和应对这些问题。
1. 除法运算符错误除法运算符(/)是常用的算术运算符之一,用于执行两个数的除法操作。
然而,在编程中,由于被除数为零的情况,会导致程序运行时错误。
为了避免这种错误,我们需要在进行除法运算之前,先判断被除数是否为零。
可以使用条件语句(if语句)来实现这一判断,当被除数为零时,给出相应的错误提示或进行其他处理。
2. 取模运算符错误取模运算符(%)用于计算两个数相除的余数。
类似于除法运算符,取模运算符也存在被除数为零的情况。
如果被除数为零,同样会导致程序运行时错误。
为了解决这个问题,我们可以在进行取模运算之前,先判断被除数是否为零。
同样地,使用条件语句来进行判断,并在被除数为零时给出错误提示或其他处理。
3. 整数除法运算符错误在某些编程语言中,整数除法运算符(/)会返回两个整数相除的整数部分,而不是精确的浮点数结果。
这可能导致精度丢失的问题。
为了避免这个问题,我们可以使用浮点数除法运算符(/)来执行除法操作,或者将其中一个操作数转换为浮点数,以保留更高的精度。
4. 浮点数比较运算符错误在编程中,我们经常需要比较两个浮点数的大小。
然而,由于浮点数在计算机中的存储方式,可能会导致比较结果不准确。
这是因为浮点数的表示是近似的,存在舍入误差。
为了解决这个问题,我们可以使用一个误差范围来进行比较,而不是直接比较两个浮点数是否相等。
例如,我们可以定义一个很小的误差值,判断两个浮点数之间的差是否小于这个误差值,来判断它们是否相等。
5. 位运算符错误位运算符是用于处理二进制数据的重要工具。
然而,在使用位运算符时,常常会出现一些错误。
例如,位移运算符(<<和>>)可能会导致溢出或错误的结果。
//========================================================================//TITLE:// MultiByteToWideChar和WideCharToMultiByte用法详解//AUTHOR:// norains//DATE:// 第一版:Monday 25-December -2006// 增补版:Wednesday 27-December -2006// 修订版:Wednesday 14-March-2007 (修正之前的错误例子)//Environment:// EVC4.0 + Standard SDK//========================================================================1.使用方法详解在本文开始之处,先简要地说一下何为短字符和宽字符.所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.好吧,那就让我们开始吧.这个是我们需要转化的多字节字符串:char sText[20] = {"多字节字符串!OK!"};我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.所幸,我们能够确知所需要的数组空间.我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);接下来,我们只需要分配响应的数组空间:wchar_t *pwText;pwText = new wchar_t[dwNum];if(!pwText){delete []pwText;}接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);最后,使用完毕当然要记得释放占用的内存:delete []psText;同理,宽字符转为多字节字符的代码如下:wchar_t wText[20] = {L"宽字符转换实例!OK!"};DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);char *psText;psText = new char[dwNum];if(!psText){delete []psText;}WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);delete []psText;如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装://-------------------------------------------------------------------------------------//Description:// This function maps a character string to a wide-character (Unicode) string ////Parameters:// lpcszStr: [in] Pointer to the character string to be converted// lpwszStr: [out] Pointer to a buffer that receives the translated string. // dwSize: [in] Size of the buffer////Return Values:// TRUE: Succeed// FALSE: Failed////Example:// MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));//---------------------------------------------------------------------------------------BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize){// Get the required size of the buffer that receives the Unicode// string.DWORD dwMinSize;dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);if(dwSize < dwMinSize){return FALSE;}// Convert headers from ASCII to Unicode.MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);return TRUE;}//-------------------------------------------------------------------------------------//Description:// This function maps a wide-character string to a new character string////Parameters:// lpcwszStr: [in] Pointer to the character string to be converted// lpszStr: [out] Pointer to a buffer that receives the translated string. // dwSize: [in] Size of the buffer////Return Values:// TRUE: Succeed// FALSE: Failed////Example:// MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));//---------------------------------------------------------------------------------------BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize){DWORD dwMinSize;dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);if(dwSize < dwMinSize){return FALSE;}WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);return TRUE;}使用方法也很简单,示例如下:wchar_t wText[10] = {L"函数示例"};char sText[20]= {0};WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.2.MultiByteToWideChar()函数乱码的问题有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".系统定制时选择默认语言的位置于:Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.WideCharToMultiByte---Unicode转ANSI(GB2312)说过了MultiByteToWideChar函数,也把WideCharToMultiByte函数也说一下吧。
Windows编程中宽字符处理与常见问题一、宽字符集(unicode)操作函数简介字符分类:宽字符函数普通C函数描述iswalnum() isalnum() 测试字符是否为数字或字母iswalpha() isalpha() 测试字符是否是字母iswcntrl() iscntrl() 测试字符是否是控制符iswdigit() isdigit() 测试字符是否为数字iswgraph() isgraph() 测试字符是否是可见字符iswlower() islower() 测试字符是否是小写字符iswprint() isprint() 测试字符是否是可打印字符iswpunct() ispunct() 测试字符是否是标点符号iswspace() isspace() 测试字符是否是空白符号iswupper() isupper() 测试字符是否是大写字符iswxdigit() isxdigit() 测试字符是否是十六进制的数字大小写转换:宽字符函数普通C函数描述towlower() tolower() 把字符转换为小写towupper() toupper() 把字符转换为大写字符比较:wcscoll() strcoll() 比较字符串日期和时间转换:宽字符函数描述strftime() 根据指定的字符串格式和locale设置格式化日期和时间wcsftime() 根据指定的字符串格式和locale设置格式化日期和时间, 并返回宽字符串strptime() 根据指定格式把字符串转换为时间值, 是strftime的反过程打印和扫描字符串:宽字符函数描述fprintf()/fwprintf() 使用vararg参量的格式化输出fscanf()/fwscanf() 格式化读入printf() 使用vararg参量的格式化输出到标准输出scanf() 从标准输入的格式化读入sprintf()/swprintf() 根据vararg参量表格式化成字符串sscanf() 以字符串作格式化读入vfprintf()/vfwprintf() 使用stdarg参量表格式化输出到文件vprintf() 使用stdarg参量表格式化输出到标准输出vsprintf()/vswprintf() 格式化stdarg参量表并写到字符串数字转换:wcstod() strtod() 把宽字符的初始部分转换为双精度浮点数wcstol() strtol() 把宽字符的初始部分转换为长整数wcstoul() strtoul() 把宽字符的初始部分转换为无符号长整数多字节字符和宽字符转换及操作:宽字符函数描述mblen() 根据locale的设置确定字符的字节数mbstowcs() 把多字节字符串转换为宽字符串mbtowc()/btowc() 把多字节字符转换为宽字符wcstombs() 把宽字符串转换为多字节字符串wctomb()/wctob() 把宽字符转换为多字节字符输入和输出:宽字符函数普通C函数描述fgetwc() fgetc() 从流中读入一个字符并转换为宽字符fgetws() fgets() 从流中读入一个字符串并转换为宽字符串fputwc() fputc() 把宽字符转换为多字节字符并且输出到标准输出fputws() fputs() 把宽字符串转换为多字节字符并且输出到标准输出串getwc() getc() 从标准输入中读取字符, 并且转换为宽字符getwchar() getchar() 从标准输入中读取字符, 并且转换为宽字符None gets() 使用fgetws()putwc() putc() 把宽字符转换成多字节字符并且写到标准输出putwchar() getchar() 把宽字符转换成多字节字符并且写到标准输出None puts() 使用fputws()字符串操作:宽字符函数普通C函数描述wcscat() strcat() 把一个字符串接到另一个字符串的尾部wcsncat() strncat() 类似于wcscat(), 而且指定粘接字符串的粘接长度.wcschr() strchr() 查找子字符串的第一个位置wcsrchr() strrchr() 从尾部开始查找子字符串出现的第一个位置wcspbrk() strpbrk() 从一字符字符串中查找另一字符串中任何一个字符第一次出现的位置wcswcs()/wcsstr() strchr() 在一字符串中查找另一字符串第一次出现的位置wcscspn() strcspn() 返回不包含第二个字符串的的初始数目wcsspn() strspn() 返回包含第二个字符串的初始数目wcscpy() strcpy() 拷贝字符串wcsncpy() strncpy() 类似于wcscpy(), 同时指定拷贝的数目wcscmp() strcmp() 比较两个宽字符串wcsncmp() strncmp() 类似于wcscmp(), 还要指定比较字符字符串的数目wcslen() strlen() 获得宽字符串的数目wcstok() strtok() 根据标示符把宽字符串分解成一系列字符串wcswidth() None 获得宽字符串的宽度wcwidth() None 获得宽字符的宽度另外还有对应于memory操作的 wmemcpy(), wmemchr(), wmemcmp(),看这篇文章,讲的很清楚UNICODE环境设置在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下。
UNICODE编译设置:C/C++, Preprocessor difinitions 去除_MBCS,加_UNICODE,UNICODE 在ProjectSetting/link/output 中设置Entry为wWinMainCRTStartup 反之为MBCS(ANSI)编译。
Unicode :宽字节字符集二、常见问题:1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
size_t strlen( const char *string );size_t wcslen( const wchar_t *string );size_t _mbstrlen( const char *string );2. 如何对DBCS(双字节字符集)字符串进行操作?函数描述PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址PTSTR CharPrev ( LPCTSTR, LPCTSTR );返回字符串中上一个字符的地址BOOL IsDBCSLeadByte( BYTE );如果该字节是DBCS字符的第一个字节,则返回非0值3. 为什幺要使用Unicode?(1)可以很容易地在不同语言之间进行数据交换。
(2)使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3)提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那幺系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。
如果希望函数返回ANSI 字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。
进行这些字符串的转换需要占用系统的时间和内存。
通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需4. 如何编写Unicode源代码?Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。
实际上,可以编写单个源代码文件,以便使用或者不使用Unicode 来对它进行编译。
只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。
当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows定义的Unicode数据类型有哪些?数据类型说明WCHAR Unicode字符PWSTR 指向Unicode字符串的指针PCWSTR 指向一个恒定的Unicode字符串的指针对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
6. 如何对Unicode进行操作?字符集特性实例ANSI 操作函数以str开头 strcpyUnicode 操作函数以wcs开头 wcscpyMBCS 操作函数以_mbs开头 _mbscpyANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)所有新的和未过时的函数在Windows2000中都同时拥有ANSI和UnicodeWindows会如下定义:#ifdef UNICODE#define CreateWindowEx CreateWindowExW#else#define CreateWindowEx CreateWindowExA#endif // !UNICODE7. 如何表示Unicode字符串常量?字符集实例ANSI “string”Unicode L“string”ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }8. 为什幺应当尽量使用操作系统函数?这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。
由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何编写符合ANSI和Unicode的应用程序?(1)将文本串视为字符数组,而不是chars数组或字节数组。