ฉันจะกำหนด CodePage และตำแหน่งที่ตั้งของระบบปฏิบัติการปัจจุบันด้วยตนเองได้อย่างไร


13

มีวิธีที่ฉันมีผู้ใช้ด้วยตนเองค้นหา Codepage ปัจจุบันและตำแหน่งที่ตั้งของ windows OS ของพวกเขาหรือไม่ มีการตั้งค่ารีจิสทรีที่เก็บข้อมูลนั้นหรือไม่?

มันก็จะมีประโยชน์ถ้าเทคนิคนั้นทำงานกลับไปสู่ ​​Windows 2000

คำตอบ:


16

chcpคุณจะได้รับหน้ารหัสที่ใช้งานอยู่

systeminfoจะแสดงสถานที่ตั้งของระบบและสถานที่ป้อนข้อมูลเหนือสิ่งอื่นใด

" หมายเหตุ : คำสั่งนี้ (systeminfo) ไม่พร้อมใช้งานใน Windows 2000 แต่คุณยังสามารถสืบค้นคอมพิวเตอร์ Windows 2000 ได้โดยใช้คำสั่งนี้บนคอมพิวเตอร์ที่ใช้ Windows XP หรือ Windows 2003 และตั้งค่าคอมพิวเตอร์ระยะไกลเป็นคอมพิวเตอร์ Windows 2000 หากผู้ใช้ปัจจุบันเข้าสู่ระบบ คำสั่งมีสิทธิ์ใช้งานบนเครื่องระยะไกล (ตัวอย่างเช่นผู้ดูแลระบบโดเมน) คุณไม่ต้องใช้ / u และ / p "
จากที่นี่


1
โปรดระวังว่าchcpจะทำให้คุณได้รับหน้ารหัสOEM ที่ใช้งานอยู่ ในฐานะที่เป็นรัฐ mklement ในคำตอบของเขามีหน้ารหัสที่ใช้งานอยู่อีกใช้ Windows, หน้ารหัส ANSI สำหรับข้อมูลเพิ่มเติมโปรดดูที่คำตอบของ mklement
kangalioo

6

โปรดทราบว่าระบบที่กำหนดมีหน้ารหัสที่ใช้งานอยู่สองหน้าที่น่าสนใจตามที่กำหนดโดยการตั้งค่าดั้งเดิมชื่อภาษาสำหรับโปรแกรมที่ไม่ใช่ Unicodeซึ่งก่อนหน้านี้รู้จักกันในชื่อระบบภาษา (ดูที่ส่วนล่างสำหรับข้อมูลพื้นหลัง):

  • OEMหน้าสำหรับการใช้งานโดยมรดกคอนโซลการใช้งาน
  • ANSIหน้าสำหรับการใช้งานโดยมรดกGUIการใช้งาน

หมายเหตุ: มีอีกสองหน้ารหัสพวกเขาจะไม่ค่อยได้ใช้อีกต่อไปและดังนั้นจึงไม่ได้กล่าวถึงที่นี่ แต่ที่: EBCDICรหัสและ (pre-OS X) Macหน้ารหัส - ดูเอกสาร WinAPI

ใช้งานหน้ารหัส OEMจะได้รับได้ง่ายที่สุดผ่านทางchcpตามที่แสดงในลืมคำตอบที่เป็นประโยชน์ของอัฒภาค - chcp <codePageNum>สมมติว่ามันก็ไม่ได้มีการเปลี่ยนแปลงอย่างชัดเจนในเซสชั่นที่มี

การกำหนดหน้ารหัส ANSI ที่ใช้งานนั้นไม่ง่าย แต่PowerShellสามารถช่วยได้เช่นกันพร้อมกับการพิจารณาชื่อและภาษาของระบบภาษา:

ในWindows 8+ / Windows Server 2012+ : ใช้Get-WinSystemLocalecmdlet:

Get-WinSystemLocale | Select-Object Name, DisplayName, 
                        @{ n='OEMCP'; e={ $_.TextInfo.OemCodePage } }, 
                        @{ n='ACP';   e={ $_.TextInfo.AnsiCodePage } }

หมายเหตุ: อาจเป็นการดึงดูดให้ใช้[cultureinfo]::CurrentCulture.TextInfo.ANSICodePageตัวอย่างเช่น แต่ไม่จำเป็นต้องสะท้อนหน้ารหัส ANSI ที่ใช้งานทั่วทั้งระบบ แต่เป็นหน้ารหัส ANSI ที่เกี่ยวข้องกับสถานที่ของผู้ใช้ปัจจุบัน (วัฒนธรรม) ซึ่งอาจแตกต่างกัน

ในระบบภาษาอังกฤษแบบสหรัฐอเมริกาผลตอบแทนข้างต้น:

Name  DisplayName             OEMCP  ACP
----  -----------             -----  ---
en-US English (United States)   437 1252

OEMCPคือหน้ารหัส OEM หน้าACPรหัส ANSI

วิธีการที่ใช้รีจิสตรีซึ่งทำงานบนระบบเก่า ๆจนถึง Windows XP :

# Get the code pages:
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage | 
     Select-Object OEMCP, ACP

ในระบบภาษาอังกฤษแบบสหรัฐอเมริกาผลตอบแทนข้างต้น:

OEMCP ACP 
----- --- 
437   1252

หากคุณต้องการได้รับชื่อ [เป็นมิตร]และ LCID ของโลแคลระบบ (แม้ว่าโปรดทราบว่า LCID จะถูกคัดค้าน):

[Globalization.CultureInfo]::GetCultureInfo([int] ('0x' + (
        Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language' Default
      ).Default)
)

ในระบบภาษาอังกฤษแบบสหรัฐอเมริกาผลตอบแทนข้างต้น:

LCID             Name             DisplayName                                                                                                                                      
----             ----             -----------                                                                                                                                      
1033             en-US            English (United States)                                                                                                                          

ข้อมูลความเป็นมา :

ตำแหน่งที่ตั้งของระบบคือชื่อดั้งเดิมของสิ่งที่เรียกว่าเป็นภาษาที่มีความหมายในปัจจุบันสำหรับโปรแกรมที่ไม่ใช่ Unicode (ดูคำศัพท์ NLS ) และตามที่ชื่อแนะนำ:

  • การตั้งค่านี้ใช้กับโปรแกรมดั้งเดิมเท่านั้น (โปรแกรมที่ไม่รองรับ Unicode)

  • มันใช้ทั้งระบบโดยไม่คำนึงถึงการตั้งค่าตำแหน่งที่ตั้งของผู้ใช้และสิทธิ์ผู้ดูแลระบบจะต้องเปลี่ยน

สิ่งสำคัญคือให้สังเกตว่าเป็นการตั้งค่าดั้งเดิมเนื่องจากโค้ดเพจไม่ได้ใช้กับโปรแกรมที่ใช้ Unicodeภายในอีกต่อไปและเรียกใช้เวอร์ชัน Unicode ของ Windows API

โดยเฉพาะอย่างยิ่งมันกำหนดหน้ารหัสที่ใช้งานเช่นการเข้ารหัสตัวอักษรที่ใช้โดยค่าเริ่มต้น :

  • หน้ารหัส ANSIที่จะใช้เมื่อโปรแกรมที่ไม่ใช่ Unicode โทรที่ไม่ใช่ Unicode (ANSI) รุ่นที่ใช้ Windows API สะดุดตารุ่น ANSI ของTextOutฟังก์ชั่นสำหรับการแปลสตริงไปและกลับจาก Unicode ซึ่งสะดุดตากำหนดวิธีสตริงของโปรแกรมแสดงผลใน GUI

  • หน้ารหัส OEMเพื่อให้ใช้งานโดยค่าเริ่มต้นในคอนโซลหน้าต่างchcpที่สะท้อนให้เห็นโดย

    • หน้ารหัสที่ใช้งานคอนโซลหน้าต่างกำหนดวิธีการใส่แป้นพิมพ์และผลลัพธ์จากการใช้งานคอนโซลถูกตีความและแสดง
      • โปรดทราบว่านั่นหมายความว่าแม้เอาต์พุตจากแอปพลิเคชันคอนโซลUnicodeจะถูกแปลเป็นหน้ารหัสที่ใช้งานอยู่ซึ่งอาจทำให้ข้อมูลสูญหาย การใช้หน้ารหัสเทียม65001ซึ่งแสดงถึงการเข้ารหัส UTF-8 ของ Unicode เป็นวิธีแก้ปัญหา แต่อาจทำให้โปรแกรมบรรทัดคำสั่งดั้งเดิมตีความข้อมูลผิดและอาจล้มเหลว - ดูคำตอบ StackOverflow นี้สำหรับรายละเอียด
    • ซึ่งแตกต่างจากหน้ารหัส ANSI ที่คุณสามารถเปลี่ยนการใช้งาน [OEM] หน้ารหัสในความต้องการสำหรับหน้าต่างคอนโซลที่กำหนด ; เช่นเพื่อสลับไปยังหน้ารหัส OEM 850รันchcp 850ในcmd.exeและ$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)ใน PowerShell
  • นอกจากนี้ไม่ค่อยได้ใช้อีกต่อไปEBCDICและMacโค้ดเพจ

แม้จะมีโลแคลของคำที่ใช้ในเทอมดั้งเดิมและภาษาของคำในเทอมปัจจุบัน:

  • เพียงด้านการควบคุมโดยการตั้งค่าเป็นชุดของหน้าเว็บรหัสที่ใช้งานและเริ่มต้นแบบอักษรบิตแมปไม่ได้นอกจากนี้ยังมีองค์ประกอบอื่น ๆ ของสถานที่เกิดเหตุ (ซึ่งถูกควบคุมโดยการตั้งค่าผู้ใช้ระดับสถาน)

  • โดยทั่วไปแล้วหน้ารหัสที่กำหนดจะใช้ร่วมกันโดยตำแหน่งที่ตั้งหลายแห่งและครอบคลุมหลายภาษา เช่นหน้ารหัสที่ใช้กันอย่างแพร่หลาย1252ถูกใช้โดยหลายภาษาในยุโรปตะวันตกรวมถึงภาษาอังกฤษ

อย่างไรก็ตามเมื่อคุณเปลี่ยนการตั้งค่าผ่านแผงควบคุมคุณจะเลือกการตั้งค่าตามสถานที่เฉพาะ

สำหรับรายการหน้ารหัส Windows ทั้งหมดให้ดูที่https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers


GetACP()ฟังก์ชั่น - technet.microsoft.com/en-us/dd318070 - นั่นคือลิงค์ที่น่าสนใจส่วนหมายเหตุทันทีบอกว่าฟังก์ชั่นการคืนค่านี้ไม่ได้แสดงถึงภาษาป้อนข้อมูลเริ่มต้นของผู้ใช้ที่เลือกและภาษา GUI แต่สิ่งที่แตกต่างกันอย่างสิ้นเชิง ...
Arioch '

อันที่จริง @ Arioch'The - นั่นคือสิ่งที่ฉันพยายามอธิบายในส่วนข้อมูลพื้นหลัง: โลแคลระบบ (a) กำหนดโค้ดเพจ (แต่ไม่มีการตั้งค่าโลแคลอื่น) ทั้งระบบ (b) โดยไม่คำนึงถึงผู้ใช้ที่กำหนด สถานที่เกิดเหตุ โปรดสังเกตว่าสถานะของหน้าที่เชื่อมโยง (เพิ่มการเน้น): "ส่งคืนตัวระบุหน้ารหัส (ACP) ของ Windows ANSI ปัจจุบันสำหรับระบบปฏิบัติการ " สำหรับศักยภาพทดแทนบุคคลที่สามที่เป็นไปได้ของ AppLocale: ฉันได้เพิ่มลิงก์ไปยังคำตอบแล้ว
mklement

1
คำพูด / ลิงค์ของ GetACP นั้นฉันคิดว่าสำคัญในการยืนยัน "word of god" ว่าการแปลงค่าเริ่มต้นของ MBCS เป็น Unicode นั้นมีวัตถุประสงค์เพื่อให้ผู้ใช้ไม่ต้องพึ่งพาและเป็นระบบปฏิบัติการระดับโลก
Arioch 'The

1
วันนี้อาจเป็นทั้ง pre-UNIX MAC และ EBCDIC เท่ากันอยู่ในช่อง "เท่านั้นที่มีความสำคัญทางประวัติศาสตร์" อย่างไรก็ตามฉันติดอยู่กับ MAC CP นั้นทำให้พวกเขาจัดการทำเครื่องหมายในบรรทัดใหม่ในไฟล์ข้อความธรรมดาแตกต่างจากทั้งต้นไม้ UNIX และ DOS-Win-OS / 2 มันเป็นกรณีมุมแปลกใหม่ที่ฉันจำได้
Arioch 'The

1
ขอบคุณ ลิงก์เฉพาะเพิ่มเติม - docs.microsoft.com/en-us/windows/desktop/Intl/ … - และ EBCDIC ถูกทำเครื่องหมาย "Windows 2000" - ดังนั้นก่อน w2k อาจไม่มีอยู่และตลอดหลายปีที่ผ่านมาไม่มีใครใส่ใจ เพื่ออัปเดตแหล่งข้อมูลการแปลงส่วนหัวที่ฉันใช้ :-D
Arioch 'The


0

API ของ Windows ที่ส่งกลับหน้ารหัสที่ใช้งานอยู่เป็นGetConsoleOutputCP ()


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