การเข้ารหัสเพื่อให้ÅÄÖทำงานอย่างไร


12

ฉันกำลังเขียนแอปพลิเคชันขนาดเล็กใน VB.net ที่จะช่วยให้ฉันสร้างบัญชีผู้ใช้ "Windows 7 บัญชี" ได้ง่ายด้วยรหัสผ่านแทนที่จะไปที่แผงควบคุม ปัญหาที่ฉันมีคือเมื่อฉันสร้างไฟล์ bat ใน VB.net โดยใช้การเข้ารหัส UTF-8 มันไม่ได้เขียนåäöอย่างที่ควรจะเป็น ฉันลองการเข้ารหัสทั้งหมดที่ฉันสามารถหาได้ แต่ไม่สามารถใช้งานได้

หากใครมีความคิดเกี่ยวกับสาเหตุที่ฉันได้รับสิ่งนี้โปรดแจ้งให้เราทราบ ขอบคุณล่วงหน้า!


ลองโพสต์บน stackoverflow.com แล้วแสดงสคริปต์ของคุณ
Toby Allen

1
@Toby Allen มันไม่ใช่คำถามการเขียนโปรแกรมจริงๆ แต่คำถามเกี่ยวกับการเข้ารหัสข้อความปัญหาเดียวกันนี้เกิดขึ้นเมื่อฉันสร้างไฟล์. bat ด้วยวิธี "ปกติ"
kagstrom2100

คำตอบ:


12

แก้ไข:ผมผิด;)
cmd.exeไม่ยอมรับ UTF-8 แต่คุณต้องให้แน่ใจว่าได้บันทึกไว้โดยไม่ต้องBOMที่จุดเริ่มต้นของแฟ้ม

นี่คือการทดสอบครั้งที่สอง คุณสามารถใช้chcp 65001ที่จุดเริ่มต้นของแบตช์ไฟล์ของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


ไฟล์แบตช์ไม่สามารถเป็นประเภท UTF-8 จำเป็นต้องเป็น ASCII Cmd.exeเพียงแค่ไม่ยอมรับรูปแบบอื่น ฉันทำแบบทดสอบเล็ก ๆ และคุณสามารถใช้ตัวละครของคุณได้ แต่มันต้องใช้งานบ้าง

ทำให้ไฟล์ที่มีtest.bat บันทึกที่มีรูปแบบecho Å Ä Ö ANSI/ASCIIเปิดcmd.exeและตรวจสอบการcmd.exeใช้งานของคุณLucida Console(เพื่อแสดงอักขระ Unicode)

เมื่อคุณพิมพ์ไฟล์มันจะแสดงตัวละครเป็นตัวละคร DOS ตัวเก่า คุณสามารถดูกราฟการแปลที่นี่

เมื่อคุณเปลี่ยนเป็น "Windows Ansi" - หน้ารหัส (เช่นยุโรปตะวันตกละติน) ด้วยchcp 1252อักขระจะแสดงอย่างถูกต้อง หากพวกเขายังได้รับการถ่ายโอนไปยังยูทิลิตี้นั้นขึ้นอยู่กับยูทิลิตี้ที่

แต่ทำไมคุณสร้างแบทช์ไฟล์สำหรับสิ่งนี้ คุณไม่สามารถเขียนโค้ดใน VB.net ได้หรือไม่

cmd.exe


แก้ไข 2 #:

นี่คือวิธีที่คุณตั้งไว้Lucida Consoleในcmd.exe:

คอนโซล Lucida


BOMมี 3 ตัวอักษรที่จุดเริ่มต้นของไฟล์ UTF-8 ( \xEF\xBB\xBF)
ใน VB.net คุณจะสร้างไฟล์โดยไม่มีสิ่งBOMนี้:

Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
                                                  '^^^^^'
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
    sink.WriteLine("...")
End Using

สวัสดีและขอบคุณสำหรับคำตอบ ในแอปพลิเคชัน vb.net ของฉันฉันกำลังพยายามสร้างไฟล์. bat ด้วยคำสั่ง: ผู้ใช้เน็ต "ชื่อผู้ใช้" net localgroup administratörer "พิมพ์" / เพิ่มเหตุผลที่ฉันต้องใช้คำว่าadminstratörerของสวีเดนแทนที่จะเป็นผู้ดูแลระบบจะชนะ localgroup ใช้การแปลภาษาอังกฤษเป็นกลุ่ม
kagstrom2100

แค่คิดว่าจะผ่าน. bat-file เป็นเรื่องเล็กน้อยเมื่อคุณสามารถทำได้โดยตรงจาก VB.net เช่นเดียวกับที่นี่ ตัวอย่างมากมายในGoogleเช่นกัน ดังนั้นไม่จำเป็นต้องสร้าง. bat ในฐานะคนกลาง และด้วยตัวอย่างเหล่านี้คุณสามารถป้อน Unicode-name โดยตรงไปยังฟังก์ชัน Windows (ยกเว้นกรณีที่คุณจำเป็นต้องเรียกใช้. bat ในเวลาที่ต่างออกไปจากแอป VB.net ของคุณด้วยเหตุผลบางอย่าง?)
Rik

ฉันได้มองหาวิธีที่จะทำสิ่งนี้ใน VB.net บน Google มาหลายวันแล้ว แต่ฉันก็ไม่พบวิธีที่จะทำได้ ฉันลองตัวอย่างที่คุณเชื่อมโยงแล้วและดูเหมือนว่าจะไม่ทำงาน ฉันจะแน่ใจได้อย่างไรว่าไฟล์. bat ไม่ได้ใช้ BOM Lucida Console คืออะไร ข้อมูลเดียวที่ฉันค้นพบเกี่ยวกับมันคือตัวอักษร เมื่อฉันลองสิ่งที่คุณทำในตัวอย่าง / ภาพที่สองฉันได้รับi.imgur.com/6sh20j0.jpg
kagstrom2100

ฉันเพิ่มคำตอบเพื่อรวมLucida Consoleและสร้างไฟล์โดยไม่BOM(แก้ไข # 2 ที่ด้านล่าง) แต่การสร้างผู้ใช้นี้ผ่านการnet userทำงานบน command-prompt หรือไม่ และจะไม่ทำงานอะไรถ้าคุณสร้างผ่าน VB.net? สำหรับสิ่งนี้เราจะต้องมีโค้ดตัวอย่าง (หรือคำถามแยกต่างหาก) เพราะสิ่งนี้ควรใช้งานได้ (BTW คุณเชื่อมโยงภาพของฉันไม่ใช่ของคุณผมคิดว่าในความคิดเห็นของคุณ)
Rik

2
@JohnLBevan ใช่คุณพูดถูก เห็นได้ชัดว่าfindไม่สามารถจัดการอินพุต UTF-8 ได้ไม่ดีนัก findstrแต่คุณสามารถใช้ เช่นนี้:ping 127.0.0.1 -n 2 | findstr /C:" = "
Rik

2

สิ่งที่แก้ไขได้สำหรับฉันคือการบันทึกไฟล์เป็น UTF-8 โดยไม่มี BOM และใช้รหัสนี้

@echo off
chcp 65001
net user Linus /add
net localgroup Administratörer Test/add

สิ่งที่ฉันไม่ได้ใช้ก่อนหน้านี้คือ@echo offเพื่อที่และการใช้ chcp 65001 คือสิ่งที่ได้รับการแก้ไข! Thanx เกินไป Rik สำหรับความช่วยเหลือทั้งหมด :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.