Windows使用UTF-16,创建UTF-16文件请设置前两个字节为0xfffe,这是UTF-16的BOM码

windows下的Unicode是UTF-16,每个字都用两个字节来表示。编程的时候,通过TEXT宏,以及在项目中定义Unicode, _Unicode变量,就可以保证整个项目都是在Unicode下工作。

现在在将字符串写入文件的时候,发生了一些问题。写文件用的是WriteFile函数,字符串本身都是UTF-16的,写入文件后发现用vim和记事本打开都无法正确显示。用16进制的方式查看,每个字都是对的,都是2个字节,如果是英文字母,第二个字节就是00。

google 了一下,发现了答案。要在文件开头写入0xfffe,这是Unicode file的identifier,windows下的记事本和写字板读到这个头之后,就能正确识别这是一个Unicode文件了。所以,在代码中,创建文 本文件的时候,要多写这样一段(用ScheduleDownload的logger.cpp来做个例子):


                     //  logfile doesn't exist, create it, that's all
          hFile  =  CreateFile(log_file_path, GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
          
if  (hFile  ==  INVALID_HANDLE_VALUE) {
             operate_result 
=  FALSE;
          } 
else  {
             
//  write 0xfffe at the beginning of the file, this makes Notepad reads Unicodes well
             WORD unicode_identifier  =   0xfeff ;
             
if  (WriteFile(hFile,  & unicode_identifier,  sizeof (WORD),  & bytes_written, NULL)) {
                operate_result 
=  TRUE;
             } 
else  {
                operate_result 
=  FALSE;
             }
          }
          
goto  finished;

    finished:
       
if  (hFile  !=  NULL  &&  hFile  !=  INVALID_HANDLE_VALUE)
          CloseHandle(hFile);
       
return  operate_result;

 

这里不要奇怪为什么设置给unicode_identifier变量的值是0xfeff,这是因为x86是little endian,所以代码中的oxfeff存在寄存器中,然后设置到内存的时候,从低地址到高地址就变成了fffe,这样最后将这个WORD写入文件之后就 正好是fffe了。

最后我自己又测试了一下,写入中文也是没有问题的。使用gvim来打开的话需要设置一下,我在Ubuntu下打开文件是OK的,windows下的gvim的.vimrc设置和Ubuntu一样的话,应该也是没问题的。

转载于:https://www.cnblogs.com/super119/archive/2011/04/10/2011406.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mini2440 beer(通常称pwm或timer)驱动,注册为misc(杂项)设备, 挂载再platform bus上, 测试信息: U-Boot 2012.07 (Aug 30 2012 - 21:55:43) +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ Welcome to my u-boot +++ +++ Liyong-zou +++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++ CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz DRAM: 64 MiB WARNING: Caches not enabled NAND: 256 MiB In: serial Out: serial Err: serial Net: dm9000 Hit any key to stop autoboot: 5 \0x08\0x08\0x08 4 \0x08\0x08\0x08 3 \0x08\0x08\0x08 2 \0x08\0x08\0x08 1 \0x08\0x08\0x08 0 dm9000 i/o: 0x20000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:01:02:03:04:05 could not establish link Using dm9000 device File transfer via NFS from server 192.168.1.30; our IP address is 192.168.1.20 Filename '/home/liyong-zou/nfs/kernel/uImage'. Load address: 0x30008000 Loading: *\0x08#######################################################T ########## \0x09 ################################################################# \0x09 #########################T ######################################## \0x09 ################################################################# \0x09 ################################################################# \0x09 ################################################################# \0x09 ###############T #######T ########### done Bytes transferred = 2164312 (210658 hex) ## Booting kernel from Legacy Image at 30008000 ... Image Name: Linux-2.6.39.4 Created: 2012-10-27 13:48:03 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2164248 Bytes = 2.1 MiB Load Address: 30008000 Entry Point: 30008040 Verifying Checksum ... OK XIP Kernel Image ... OK OK Starting kernel ... Uncompressing Linux... done, booting the kernel. Linux version 2.6.39.4 (liyong-zou@liyongzou-desktop) (gcc version 4.4.3 (ctng-1.6.1) ) #86 Sat Oct 27 21:47:46 CST 2012 CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177 CPU: VIVT data cache, VIVT instruction cache Machine: MINI2440 Memory policy: ECC disabled, Data cache writeback CPU S3C2440A (id 0x32440001) S3C24XX Clocks, Copyright 2004 Simtec Electronics S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 Kernel command line: noinitrd root=/dev/nfs nfsroot=192.168.1.30:/home/liyong-zou/nfs/rootfs ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 PID hash table entries: 256 (order: -2, 1024 bytes) Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) Memory: 64MB = 64MB total Memory: 60500k/60500k available, 5036k reserved, 0K highmem Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) DMA : 0xffc00000 - 0xffe00000 ( 2 MB) vmalloc : 0xc4800000 - 0xf6000000 ( 792 MB) lowmem : 0xc0000000 - 0xc4000000 ( 64 MB) modules : 0xbf000000 - 0xc0000000 ( 16 MB) .init : 0xc0008000 - 0xc002a000 ( 136 kB) .text : 0xc002a000 - 0xc03f3ea4 (3880 kB) .data : 0xc03f4000 - 0xc0418c40 ( 148 kB) SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 NR_IRQS:85 irq: clearing subpending status 00000002 Console: colour dummy device 80x30 console [ttySAC0] enabled Calibrating delay loop... 49.56 BogoMIPS (lpj=123904) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok gpiochip_add: gpios 288..303 (GPIOK) failed to register gpiochip_add: gpios 320..334 (GPIOL) failed to register gpiochip_add: gpios 352..353 (GPIOM) failed to register NET: Registered protocol family 16 MINI2440: Option string mini2440=0tb MINI2440: LCD [0:240x320] 1:800x480 2:1024x768 S3C2440: Initialising architecture S3C2440: IRQ Support S3C244X: Clock Support, DVS off bio: create slab <bio-0> at 0 usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb s3c-i2c s3c2440-i2c: slave address 0x10 s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter Advanced Linux Sound Architecture Driver Version 1.0.24. NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 2048 (order: 2, 16384 bytes) TCP bind hash table entries: 2048 (order: 1, 8192 bytes) TCP: Hash tables configured (established 2048 bind 2048) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. JFFS2 version 2.2. (NAND) \0xc2\0xa9 2001-2006 Red Hat, Inc. ROMFS MTD (C) 2007 Red Hat, Inc. msgmni has been set to 118 io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) Console: switching to colour frame buffer device 60x53 fb0: s3c2410fb frame buffer device backlight initialized s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2440 s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2440 s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2440 brd: module loaded mini2440_beer# register OK s3c2440_adc# register W1 OK at24 0-0050: 1024 byte 24c08 EEPROM, writable, 16 bytes/write S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=2 20ns s3c24xx-nand s3c2440-nand: NAND soft ECC NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit) Creating 5 MTD partitions on "nand": 0x000000000000-0x000000080000 : "u-boot" 0x000000080000-0x0000000a0000 : "u-boot-env" 0x0000000a0000-0x0000006a0000 : "kernel" 0x0000006a0000-0x0000046a0000 : "root" 0x0000046a0000-0x000010000000 : "extend" dm9000 Ethernet Driver, V1.31 eth0: dm9000e at c4872300,c4876304 IRQ 51 MAC: 00:01:02:03:04:05 (chip) ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver s3c2410-ohci s3c2410-ohci: S3C24XX OHCI s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1 s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000 hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected usbcore: registered new interface driver libusual s3c2440-usbgadget s3c2440-usbgadget: S3C2440: increasing FIFO to 128 bytes mousedev: PS/2 mouse device common for all mice input: gpio-keys as /devices/platform/gpio-keys/input/input0 input: mini2440_ts as /devices/platform/mini2440_ts/input/input1 mini2440_ts# register OK S3C24XX RTC, (c) 2004,2006 Simtec Electronics s3c-rtc s3c2410-rtc: rtc disabled, re-enabling s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0 i2c /dev entries driver S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled cpuidle: using governor ladder sdhci: Secure Digital Host Controller Interface driver sdhci: Copyright(c) Pierre Ossman s3c-sdi s3c2440-sdi: powered down. s3c-sdi s3c2440-sdi: mmc0 - using pio, sw SDIO IRQ usbcore: registered new interface driver usbhid usbhid: USB HID core driver ALSA device list: No soundcards found. TCP cubic registered NET: Registered protocol family 17 Registering the dns_resolver key type s3c-rtc s3c2410-rtc: setting system clock to 2000-02-26 23:38:54 UTC (951608334) dm9000 dm9000: eth0: link down IP-Config: Complete: device=eth0, addr=192.168.1.20, mask=255.255.255.0, gw=192.168.1.1, host=192.168.1.20, domain=, nis-domain=(none), bootserver=192.168.1.30, rootserver=192.168.1.30, rootpath= dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1 VFS: Mounted root (nfs filesystem) on device 0:14. Freeing init memory: 136K Please press Enter to activate this console. Liyong-zou [root@Liyong-zou /]#/home/test_beer please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:1 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:6 and type the arg:100 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:6 and type the arg:99 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:22 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:1 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:6 and type the arg:50 please type operation: \0x09type 0 to exit \0x09type 1 to start beer \0x09type 22 to stop beer \0x09type 3 to set prescaler(1~256) \0x09type 4 to set divier(2/4/8/16) \0x09type 5 to set freq(20~20000) \0x09type 6 to set pwm(0~100) \0x09what are you want:0 [root@Liyong-zou /]#

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值