将 UTF-16 转换为 UTF-8 并删除 BOM?

问题描述 投票:0回答:3

我们有一位数据输入人员在 Windows 上使用 UTF-16 编码,希望使用 utf-8 并删除 BOM。 utf-8 转换有效,但 BOM 仍然存在。我该如何删除这个?这是我目前拥有的:

batch_3={'src':'/Users/jt/src','dest':'/Users/jt/dest/'}
batches=[batch_3]

for b in batches:
  s_files=os.listdir(b['src'])
  for file_name in s_files:
    ff_name = os.path.join(b['src'], file_name)  
    if (os.path.isfile(ff_name) and ff_name.endswith('.json')):
      print ff_name
      target_file_name=os.path.join(b['dest'], file_name)
      BLOCKSIZE = 1048576
      with codecs.open(ff_name, "r", "utf-16-le") as source_file:
        with codecs.open(target_file_name, "w+", "utf-8") as target_file:
          while True:
            contents = source_file.read(BLOCKSIZE)
            if not contents:
              break
            target_file.write(contents)

如果我 hexdump -C 我看到:

Wed Jan 11$ hexdump -C svy-m-317.json 
00000000  ef bb bf 7b 0d 0a 20 20  20 20 22 6e 61 6d 65 22  |...{..    "name"|
00000010  3a 22 53 61 76 6f 72 79  20 4d 61 6c 69 62 75 2d  |:"Savory Malibu-|

在生成的文件中。如何删除 BOM?

谢谢

python unicode utf-8 utf-16
3个回答
41
投票

这就是

UTF-16LE
UTF-16

之间的区别
  • UTF-16LE
    是小尾数 没有 BOM
  • UTF-16
    是大尾数还是小尾数 带有 BOM

因此,当您使用

UTF-16LE
时,BOM只是文本的一部分。请改用
UTF-16
,以便自动删除 BOM。
UTF-16LE
UTF-16BE
存在的原因是人们可以携带“正确编码”的文本而无需 BOM,但这不适用于您。

注意当您使用一种编码进行编码并使用另一种编码进行解码时会发生什么。 (

UTF-16
有时会自动检测到
UTF-16LE
,但并非总是如此。)

>>> u'Hello, world'.encode('UTF-16LE')
'H\x00e\x00l\x00l\x00o\x00,\x00 \x00w\x00o\x00r\x00l\x00d\x00'
>>> u'Hello, world'.encode('UTF-16')
'\xff\xfeH\x00e\x00l\x00l\x00o\x00,\x00 \x00w\x00o\x00r\x00l\x00d\x00'
 ^^^^^^^^ (BOM)

>>> u'Hello, world'.encode('UTF-16LE').decode('UTF-16')
u'Hello, world'
>>> u'Hello, world'.encode('UTF-16').decode('UTF-16LE')
u'\ufeffHello, world'
    ^^^^ (BOM)

或者您可以在 shell 上执行此操作:

for x in * ; do iconv -f UTF-16 -t UTF-8 <"$x" | dos2unix >"$x.tmp" && mv "$x.tmp" "$x"; done

29
投票

只需使用

str.decode
str.encode
:

with open(ff_name, 'rb') as source_file:
  with open(target_file_name, 'w+b') as dest_file:
    contents = source_file.read()
    dest_file.write(contents.decode('utf-16').encode('utf-8'))

str.decode
将为您摆脱 BOM(并推断出字节序)。


0
投票

����4?,kotlin/coroutines/jvm/internal/DebugProbesKt java/lang/ObjectprobeCoroutineCreatedB(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;c(Lkotlin/coroutines/Continuation<-TT;>;)Lkotlin/协程/Continuation;#Lorg/jetbrains/annotations/NotNull; 补全 kotlin/jvm/internal/Intrinsics checkNotNullParameter'(Ljava/lang/Object;Ljava/lang/String;)V u000e 1kotlinx/协程/调试/内部/DebugProbesImplINSTANCE3Lkotlinx/协程/调试/内部/DebugProbesImpl; -probeCoroutineCreated$kotlinx_coroutines_core Lkotlin/coroutines/Continuation;probeCoroutineResumed#(Lkotlin/coroutines/Continuation;)V&(Lkotlin/coroutines/Continuation<>;)Vframe-probeCoroutineResumed$kotlinx_coroutines_core !probeCoroutineSuspending/probeCoroutineSuspended$kotlinx_coroutines_core $ %Lkotlin/元数据;mvkxi0d1o�� �� u0010 “ ��H0”�� 2 H0H�� 02 0H·02 0H���d2T5kotlinx-coroutines-integration-testing_debugAgentTest DebugProbes.ktCode LineNumberTableLocalVariableTable SignatureRuntimeInvisibleAnnotations$RuntimeInvisibleParameterAnnotations SourceFileRuntimeVisibleAnnotations178 � ���8 9 :;<78� ��"�8 9 :<#78� ��&�8 9 :<=6>F'([I)II+,I-.I/0[s12[ sss3s ss4ss#s5

© www.soinside.com 2019 - 2024. All rights reserved.