您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页WinCE平台写txt文件乱码的问题

WinCE平台写txt文件乱码的问题

来源:吉趣旅游网
使用2种方法解决WriteFile和Cstdiofile

1. Unicode编码文本

.NET Framework 使用 Unicode UTF-16(Unicode 转换格式,16 位编码形式)来表示字符。在某些情况下,.NET Framework 在内部使用 UTF-8。 “Unicode 标准”是用于字符和文本的通用字符编码方案。它为世界上的书面语言中使用的每一个字符赋予一个唯一的数值(称为码位)和名称。例如,字符“A”由码位“U+0041”和名称“LATIN CAPITAL LETTER A”表示。有 65,000 个以上的字符有值,并且还有再支持多达一百万个字符的余地。有关更多信息,请参见位于 www.unicode.org 的 Unicode Standard(Unicode 标准)。

以往,不同区域性的不同语言要求迫使应用程序在内部使用不同的编码方案表示数据。这些不同的编码方案迫使开发人员为操作系统和应用程序创建零碎的基本代码,如用于欧洲语言的单字节版本、用于亚洲语言的双字节版本以及用于中东语言的双向版本。这种零碎的代码库使得难以在不同的区域性之间共享数据,并且对于开发支持多语言用户界面的全球通用应用程序来说尤为困难。

Unicode 数据编码方案简化了开发全球通用应用程序的过程,因为它允许用单个编码方案来表示世界上使用的所有字符。应用程序开发人员不必再跟踪用于产生特定语言字符的编码方案,并且数据可以在世界上的各系统之间共享而不会受到损坏。

2. 字符的表示

字符是可使用多种不同字符方案或代码页来表示的抽象实体。例如,Unicode UTF-16 编码将字符表示为16位整数序列,而Unicode UTF-8 编码则将相同的字符表示为 8 位字节序列。公共语言运行库使用Unicode UTF-16(Unicode 转换格式,16位编码形式)表示字符。

针对公共语言运行库的应用程序使用编码将字符表式形式从本机字符方案映射至其他方案。应用程序使用解码将字符从非本机方案映射至本机方案。下表列出了 System.Text 命名空间中对字符进行编码和解码的最常用的类。

字符方案 ASCII 编码 多种编码

说明

System.Text.ASCIIEncoding 将字符与 ASCII 字符相互转换。 System.Text.Encoding

将字符与 Convert 方法中指定的各种编码相互转换。

UTF-16 Unicode System.Text.UnicodeEncoding 在其他编码与 UTF-16 编码之间进行转换。此方案将字编码

UTF-8 Unicode 编码

System.Text.UTF8Encoding

符表示为 16 位整数。

在其他编码与 UTF-8 编码之间进行转换。此宽度可变编码方案用一至四个字节表示字符。

3. ANSI编码

指定 Visual Basic 应将所有字符串封送到 American National Standards Institute (ANSI) 值,不管所声明的外部过程的名称是什么。

调用在项目外定义的过程时,Visual Basic 编译器不能访问正确调用过程所需的信息。这些信息包括过程所在位置、标识方式、调用序列和返回类型以及它所使用的字符串字符集。Declare 语句创建一个对外部过程的引用并提供这些必需的信息。

Declare 语句中的 charsetmodifier 部分提供在调用外部过程期间封送字符串所需的字符集信息。它还影响 Visual Basic 在外部文件中搜索外部过程名称的方式。Ansi 修饰符指定 Visual Basic 应将所有字符串封送到 ANSI 值,并应查询该过程,同时在搜索期间不修改过程的名称。

如果没有指定字符集修饰符,则默认使用 Ansi。

标准 C++ 库包含最新的 ANSI C++ 扩展,包括标准模板库和一个新的 iostream 库。标准 C++ 库提供了新的功能,比如许多操作 C++ 对象的算法和为开发人员提供的移到标准 iostream 的迁移路径。

从 Visual Studio .NET 2003 开始,Visual C++ 将不再提供旧的 iostream 库。 标准 C++ 库是一组头文件。在标准 C++ 库概述中可以找到头文件列表。新的头文件没有 .h 扩展名。

4. WinCE中Unicode文本文档的编写

在程序运行的时候通常要记录一些log文件,通常使用的方法是把程序运行信息输出到txt文本。因为WinCE中使用的是Unicode,普通的windows,ANSI txt文本编写方法在WinCE中使用不了。

在WinCE之中,默认使用Unicode双字节编码而非传统系统的ANSI单字节,因此在编写txt文本的时候,需要进行一些设置,才能无乱码的查看。呵呵,说白了就是要写Unicode编码的TXT文本。

Unicode编码文本与ANSI编码文本的区别是:Unicode文本的前面两个字节内容是FF FE。因此在WinCE创建文本的时候需要先写两个字节的内容FF FE,说明该文本是Unicode的。然后在调用WriteFile的时候也需要注意一个地方,就是要写入字符串的长度。

由于Unicode是双字节的,而WriteFile是按字节计算的,因此写入的字符串要乘以2. 由于Windows是低字节在前,高字节在后的,因此如果设置Unicode标记则为 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

WORD wUnicodeFlag = 0xFEFF;

BOOL WriteToFile(LPCTSTR lpData) {

BOOL bResult = FALSE; HANDLE hFile; DWORD dwByteWrite; TCHAR szBuf[256];

hFile = CreateFile(TEXT(\"\\\\RegRecord.txt\"), GENERIC_READ | GENERIC_WRITE, 0, // Share mode

NULL, // lpSecurityAttribute

OPEN_ALWAYS, // Create disposition FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE) {

17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 5、

StringCchPrintf(szBuf, 256, TEXT(\"WriteFile:%d\"), GetLastError()); MessageBox(NULL, szBuf, TEXT(\"Error\"), MB_ICONERROR); return bResult; }

// Write the unicode flag

if (GetLastError() != ERROR_ALREADY_EXISTS) {

WORD wUnicodeFlag; wUnicodeFlag = 0xFEFF;

if (!WriteFile(hFile, &wUnicodeFlag, sizeof(WORD), &dwByteWrite, NULL)) {

StringCchPrintf(szBuf, 256, TEXT(\"WriteFile:%d\"), GetLastError()); MessageBox(NULL, szBuf, TEXT(\"Error\"), MB_ICONERROR); }

}

SetFilePointer(hFile, 0, NULL, FILE_END);

if (!WriteFile(hFile, lpData,

_tcslen(lpData)*sizeof(TCHAR), // bytes wait to write. &dwByteWrite,

NULL)) {

StringCchPrintf(szBuf, 256, TEXT(\"WriteFile:%d\"), GetLastError()); MessageBox(NULL, szBuf, TEXT(\"Error\"), MB_ICONERROR); } else

{

bResult = TRUE; }

CloseHandle(hFile); return bResult; }

CString str, strName; strName=L””; CStdioFile f;

if(!f.Open(strName,CStdioFile::modeReadWrite /*| CFile::typeText | CFile::modeNoTruncate*/))

{ //如果没有文件 }

WORD s=0xFEFF;

f.Write(&s,sizeof(s)); str=_T(\"无文件输出\"); f.WriteString(str);

if(!f.Open(strName,CStdioFile::modeReadWrite /*| CFile::typeText*/ | { } else

{//目标文件是新建的 }

CString str;

str = _T(\"错误:打开文件:\") + strName + _T(\"失败!\"); AfxMessageBox(str,MB_ICONSTOP); return;

CFile::modeCreate))

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- jqkq.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务