Làm thế nào để sử dụng các ký tự unicode trong dòng lệnh Windows?


316

Chúng tôi có một dự án trong Team Foundation Server (TFS) có một ký tự không phải tiếng Anh (š) trong đó. Khi cố gắng viết kịch bản một vài thứ liên quan đến xây dựng, chúng tôi đã vấp phải một vấn đề - chúng tôi không thể chuyển thư š cho các công cụ dòng lệnh. Dấu nhắc lệnh hoặc những gì không làm rối nó và tiện ích tf.exe không thể tìm thấy dự án đã chỉ định.

Tôi đã thử các định dạng khác nhau cho tệp .bat (ANSI, UTF-8 có và không có BOM ) cũng như tạo tập lệnh trong JavaScript (vốn là Unicode) - nhưng không may mắn. Làm cách nào để thực thi chương trình và truyền cho nó một dòng lệnh Unicode ?


1
@JohannesDewender - Sao chép-dán sai?
Vilx-

2
Python 3.6: "bảng điều khiển mặc định trên Windows chấp nhận tất cả các ký tự Unicode với phiên bản đó" (tốt, hầu hết là cho tôi) NHƯNG bạn cần định cấu hình bảng điều khiển: nhấp chuột phải vào đầu cửa sổ (của cmd hoặc IDLE python ), trong mặc định / phông chữ, chọn "Bảng điều khiển Lucida".
JinSnow



2
@ LưuViênPhúc - Không, đây là về việc truyền các đối số dòng lệnh unicode, thay vì hiển thị văn bản trong bảng điều khiển. Bảng điều khiển có thể không tham gia vào tất cả.
Vilx-

Câu trả lời:


68

Nền tảng của tôi: Tôi sử dụng đầu vào / đầu ra Unicode trong bảng điều khiển trong nhiều năm (và thực hiện nó hàng ngày. Ngoài ra, tôi phát triển các công cụ hỗ trợ cho chính xác nhiệm vụ này). Có rất ít vấn đề, theo như bạn hiểu các sự kiện / giới hạn sau:

  • CMDvà giao diện điều khiển trực tuyến là các yếu tố không liên quan. CMD.exechỉ là một trong những chương trình đã sẵn sàng để hoạt động bên trong một giao diện điều khiển (một ứng dụng bảng điều khiển của Wikipedia).
  • AFAIK, CMDcó hỗ trợ hoàn hảo cho Unicode; bạn có thể nhập / xuất tất cả các ký tự Unicode khi bất kỳ bảng mã nào đang hoạt động.
  • Bảng điều khiển của Windows có RẤT NHIỀU hỗ trợ cho Unicode - nhưng nó không hoàn hảo (chỉ cần đủ tốt, hay, xem bên dưới).
  • chcp 65001rất nguy hiểm. Trừ khi một chương trình được thiết kế đặc biệt để khắc phục các lỗi trong API của Windows (hoặc sử dụng thư viện thời gian chạy C có các cách giải quyết này), nó sẽ không hoạt động đáng tin cậy. Win8 khắc phục những vấn đề này cp65001, nhưng phần còn lại vẫn có thể áp dụng cho Win10 .
  • Tôi làm việc trong cp1252. Như tôi đã nói: Để nhập / xuất Unicode trong bảng điều khiển, người ta không cần thiết lập bảng mã .

Các chi tiết

  • Để đọc / ghi Unicode vào bảng điều khiển, một ứng dụng (hoặc thư viện thời gian chạy C của nó) phải đủ thông minh để sử dụng không phải File-I/OAPI, mà là Console-I/OAPI. (Ví dụ, xem cách Python thực hiện .)
  • Tương tự, để đọc các đối số dòng lệnh Unicode, một ứng dụng (hoặc thư viện thời gian chạy C của nó) phải đủ thông minh để sử dụng API tương ứng.
  • Kết xuất phông chữ bảng điều khiển chỉ hỗ trợ các ký tự Unicode trong BMP (nói cách khác: bên dưới U+10000). Chỉ hỗ trợ kết xuất văn bản đơn giản (vì vậy tiếng Âu - và một số ngôn ngữ Đông Á - sẽ hoạt động tốt - theo như cách sử dụng các biểu mẫu được phân tách trước). [Có một bản in nhỏ ở đây cho Đông Á và cho các ký tự U + 0000, U + 0001, U + 30FB.]

Cân nhắc thực tế

  • Mặc định trên Window không hữu ích lắm. Để có trải nghiệm tốt nhất, người ta nên điều chỉnh 3 phần cấu hình:

    • Đối với đầu ra: một phông chữ giao diện điều khiển toàn diện. Để có kết quả tốt nhất, tôi khuyên bạn nên xây dựng . (Các hướng dẫn cài đặt có mặt ở đó - và cũng được liệt kê trong các câu trả lời khác trên trang này.)
    • Đối với đầu vào: một bố trí bàn phím có khả năng. Để có kết quả tốt nhất, tôi khuyên bạn nên bố trí của tôi .
    • Đối với đầu vào: cho phép đầu vào HEX của Unicode .
  • Thêm một vấn đề nữa với việc dán Past vào một ứng dụng console (rất kỹ thuật):

    • HEX đầu vào cung cấp một nhân vật trên KeyUpcủa Alt; tất cả các cách khác để cung cấp một nhân vật xảy ra trên KeyDown; rất nhiều ứng dụng chưa sẵn sàng để xem một nhân vật trên KeyUp. (Chỉ áp dụng cho các ứng dụng sử dụng Console-I/OAPI.)
    • Kết luận: nhiều ứng dụng sẽ không phản ứng với các sự kiện đầu vào HEX.
    • Ngoài ra, những gì xảy ra với một ký tự của Past Pasted phụ thuộc vào cách bố trí bàn phím hiện tại: nếu ký tự có thể được gõ mà không sử dụng các phím tiền tố (nhưng với sự kết hợp phức tạp của các bộ sửa đổi, như trong Ctrl-Alt-AltGr-Kana-Shift-Gray*) thì nó được phân phối trên một phím bấm được mô phỏng. Đây là điều mà bất kỳ ứng dụng nào cũng mong đợi - vì vậy việc dán bất cứ thứ gì chỉ chứa các ký tự đó là ổn.
    • Tuy nhiên, các ký tự khác của Viking được phân phối bằng cách mô phỏng đầu vào HEX .

    Kết luận : trừ khi bố cục bàn phím của bạn hỗ trợ đầu vào RẤT NHIỀU ký tự không có phím tiền tố, một số ứng dụng lỗi có thể bỏ qua các ký tự khi bạnPastethông qua UI của Console :Alt-Space E P. ( Đây là lý do tại sao tôi khuyên bạn nên sử dụng bố trí bàn phím của mình!)

Mọi người cũng nên nhớ rằng máy chơi game thay thế, 'có khả năng hơn', dành cho Windows hoàn toàn không phải là máy chơi game . Chúng không hỗ trợ Console-I/OAPI, vì vậy các chương trình dựa trên các API này hoạt động sẽ không hoạt động. (Tuy nhiên, các chương trình chỉ sử dụng API File-I / O của bộ điều khiển cho tập tin bàn điều khiển có thể hoạt động tốt.)

Một ví dụ về giao diện điều khiển không như vậy là một phần của MicroSoft Powershell. Tôi không sử dụng nó; để thử nghiệm, nhấn và phát hành WinKey, sau đó gõ powershell.


(Mặt khác, có những chương trình như ConEmuhay ANSICONmà cố gắng làm nhiều hơn nữa: họ “nỗ lực” để đánh chặn Console-I/O. API để làm cho “giao diện điều khiển ứng dụng true” làm việc quá này chắc chắn làm việc cho chương trình ví dụ đồ chơi; trong cuộc sống thực, điều này có thể hoặc có thể không giải quyết vấn đề cụ thể của bạn. Thử nghiệm.)

Tóm lược

  • đặt phông chữ, bố trí bàn phím (và tùy chọn, cho phép nhập HEX).

  • chỉ sử dụng các chương trình đi qua Console-I/OAPI và chấp nhận đối số dòng lệnh Unicode. Ví dụ, bất kỳ cygwinchương trình được biên dịch nào cũng sẽ ổn. Như tôi đã nói, CMDcũng tốt.

CẬP NHẬT : Ban đầu, đối với một lỗi trong cp65001, tôi đã trộn lẫn các lớp Kernel và CRTL ( UPD²: và API chế độ người dùng Windows!). Ngoài ra: Win8 sửa một nửa lỗi này; Tôi đã làm rõ phần về ứng dụng Giao diện điều khiển tốt hơn của Wap và thêm một tham chiếu đến cách Python thực hiện.


OK, đối với một cái gì đó kỹ lưỡng này , bạn xứng đáng là câu trả lời được chấp nhận! Tuyệt vời!
Vilx-

5
Tôi là người mới sử dụng C ++ và không thể hiểu câu trả lời này sau khi đọc kỹ. Ai đó có thể giúp tôi về điều này hoặc làm cho một lời giải thích dễ dàng hơn?
Rick

@Bachi Nhờ Bachi, tôi phát hiện ra rằng v73 bố cục bàn phím của tôi (đã đề cập ở trên) bị thiếu một số tệp hỗ trợ. Bây giờ đã sửa! (Đánh giá bởi tôi .logfile, nó là một lỗi liên tục trong zip -rukhông có đầu mối làm thế nào để gỡ lỗi nó [?!] -. Hoặc tránh trong tương lai ...)
Ilya Zakharevich

@Rick: Phải rồi! Tôi đã thêm một liên kết đến một cách giải quyết trong Python (nhưng tôi không thể tìm thấy một liên kết trực tiếp đến bản vá ngay bây giờ).
Ilya Zakharevich

@IlyaZakharevich: D Cảm ơn bạn. Nhưng bằng cách nào đó tôi từ bỏ sử dụng unicode trên Windows. Tôi sẽ sử dụng Linux sau này.
Rick

387

Thử:

chcp 65001

sẽ thay đổi trang mã thành UTF-8. Ngoài ra, bạn cần sử dụng phông chữ bảng điều khiển Lucida.


18
Bạn có biết nếu có một cách để làm điều này mặc định?
AnnanFay

82
Lưu ý rằng có các lỗi triển khai nghiêm trọng trong hỗ trợ trang 65001 của mã Windows, điều này sẽ phá vỡ nhiều ứng dụng dựa trên các phương thức IO của thư viện chuẩn C, vì vậy điều này rất dễ hỏng. (Các tệp hàng loạt cũng chỉ dừng hoạt động vào năm 65001.) Thật không may UTF-8 là một công dân hạng hai trong Windows.
bobince

7
@bobince Bạn có ví dụ về lỗi trong hỗ trợ mã trang Windows 65001 không? Tôi tò mò vì tôi chưa bao giờ gặp phải một ai, và việc này cũng không biến thành bất cứ điều gì. (Tất nhiên, các tệp hàng loạt ngừng hoạt động, nhưng UTF-8 hầu như không phải là công dân hạng hai ...)
Roman Starkov

17
@romkyns: Sự hiểu biết của tôi là các cuộc gọi trả về một số byte (chẳng hạn như fread / fwrite / etc) thực sự trả về một số ký tự. Điều này gây ra một loạt các triệu chứng, chẳng hạn như đọc đầu vào không đầy đủ, bị treo trong fflush, các tệp bó bị hỏng, v.v. Một số nền tảng. Các trang mã mặc định được sử dụng cho các địa phương "multibyte" của CJK có xử lý đặc biệt được tích hợp để khắc phục điều này, nhưng 65001 thì không - nó không được hỗ trợ .
bobince

7
Câu hỏi thú vị ở đây - là lỗi bởi vì nó nên báo cáo byte và thay vào đó báo cáo các ký tự - hoặc bởi vì các ứng dụng sử dụng nó đã giả sử byte = ký tự không chính xác? Nói cách khác, đó là một API thất bại hay việc sử dụng API thất bại?
Cơ bản

36

Tôi gặp vấn đề tương tự (tôi đến từ Cộng hòa Séc). Tôi có cài đặt tiếng Anh cho Windows và tôi phải làm việc với các tệp trên ổ đĩa chung. Đường dẫn đến các tệp bao gồm các ký tự cụ thể của Séc.

Giải pháp hiệu quả với tôi là:

Trong tệp bó, thay đổi trang bộ ký tự

Tập tin lô của tôi:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

Tệp bó phải được lưu trong CP 1250.

Lưu ý rằng bảng điều khiển sẽ không hiển thị chính xác các ký tự, nhưng nó sẽ hiểu chúng ...


1
Chúc mừng! Tôi cần điều này để tôi có thể nhập ký tự bản quyền trong tệp bó của mình.
Lea Hayes

Điều này làm việc hoàn hảo cho tôi trong một tình huống gần như giống hệt với bạn. Thay vào con đường của tôi chứa ký tự Gaelic Irish tức á, é, í, ó, và ú.
Seany84

@vanna giải quyết "các ký tự và khoảng trắng của Thổ Nhĩ Kỳ trong đường dẫn về sự cố mạng". bạn tuyệt lắm.
caglaror


2
Có lẽ bạn chỉ cần sử dụng phông chữ khác nhau để hiển thị chính xác các ký tự, Bảng điều khiển Lucida làm việc cho tôi.
Vlastimil Ovčáčík

29

Kiểm tra ngôn ngữ cho các chương trình không Unicode. Nếu bạn gặp vấn đề với tiếng Nga trong bảng điều khiển Windows, thì bạn nên đặt tiếng Nga tại đây:

Thay đổi ngôn ngữ cho các chương trình không Unicode


6
Điều đó không cho phép hỗ trợ Unicode cmd, nó chỉ chuyển bộ mã mặc định sang cp866bộ ký tự 8 bit. Nó thậm chí còn sử dụng cp866thay vì cp1251thêm rắc rối rắc rối của riêng mình.
ivan_pozdeev

1
Xem thêm tôi trả lời bên dưới để biết tùy chọn mới trong các phiên bản Windows 10 mới hơn
zvi

14

Rất khó để thay đổi Codepage mặc định của bảng điều khiển Windows. Khi bạn tìm kiếm trên web, bạn sẽ tìm thấy các đề xuất khác nhau, tuy nhiên một số trong số chúng có thể phá vỡ hoàn toàn Windows của bạn, tức là PC của bạn không khởi động được nữa.

Giải pháp an toàn nhất là giải pháp này: Chuyển đến khóa Registry của bạn HKEY_CURRENT_USER\Software\Microsoft\Command Processorvà thêm String value Autorun= chcp 65001.

Hoặc bạn có thể sử dụng Batch-Script nhỏ này cho các trang mã phổ biến nhất.

@ECHO off

SET ROOT_KEY="HKEY_CURRENT_USER"


FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i

ECHO System default values:

ECHO.
ECHO ...............................................
ECHO Select Codepage 
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.


SET /P  CP="Select a Codepage: "

if %CP%==1 (
    echo Set default Codepage to CP1252
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
    echo Set default Codepage to UTF-8
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
    echo Set default Codepage to CP850
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
    echo Set default Codepage to ISO-8859-1
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
    echo Set default Codepage to ISO-8859-15
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
    echo Set default Codepage to ASCII
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
    echo Reset Codepage to System Default
    reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
    echo Bye
) else (
    echo Invalid choice
    pause
)

Sử dụng @chcp 65001>nulthay vì chcp 65001triệt tiêu đầu ra "Trang mã hoạt động: 65001" bạn sẽ nhận được mỗi khi bạn bắt đầu một cửa sổ dòng lệnh mới.

Danh sách đầy đủ tất cả số có sẵn bạn có thể nhận được từ Mã định danh trang mã

Lưu ý, cài đặt sẽ chỉ áp dụng cho người dùng hiện tại. Nếu bạn muốn đặt nó cho tất cả người dùng, hãy thay thế dòng SET ROOT_KEY="HKEY_CURRENT_USER"bằngSET ROOT_KEY="HKEY_LOCAL_MACHINE"


ý tưởng tốt đẹp và ví dụ có thể sử dụng quá!

13

Trên thực tế, mẹo là dấu nhắc lệnh thực sự hiểu các ký tự không phải tiếng Anh này, chỉ không thể hiển thị chúng chính xác.

Khi tôi nhập một đường dẫn trong dấu nhắc lệnh có chứa một số phần tử không phải tiếng Anh, nó sẽ được hiển thị là "?? ?????????". Khi bạn gửi lệnh của mình (cd "??? ?????????" trong trường hợp của tôi), mọi thứ đều hoạt động như mong đợi.


2
Điều này có thể là một chút nguy hiểm khi bạn có thể nhận được xung đột đặt tên. ví dụ: nếu bạn có hai tệp cả hai kết xuất là "???" và bạn nhập "cd ???" nó sẽ không biết nên sử dụng cái nào (hoặc tệ hơn là chọn một cái tùy ý).
John

26
Bạn không nhập ???, bạn nhập tên thật nó chỉ được hiển thị là ???. Hãy nghĩ về nó như là một hộp nhập mật khẩu. Bất cứ thứ gì bạn nhập đều được hiển thị là ***, nhưng đã gửi là văn bản gốc.
Người dùng

Điều này thực sự đã làm việc cho các lệnh chạy trực tiếp trong dấu nhắc lệnh. Tuy nhiên, với việc chạy một .cmdtệp bó, tôi vẫn cần đặt chcp 65001ở đầu tệp bó.
wvducky

Trong trường hợp của bạn, đó là một vấn đề về phông chữ ... nội dung là có, chỉ là không có phông chữ phù hợp để hiển thị nó. Nhưng OP thì khác.
WesternGun

11

Trên máy Windows 10 x64, tôi đã thực hiện dấu nhắc lệnh hiển thị các ký tự không phải tiếng Anh bằng cách:

Mở một dấu nhắc lệnh nâng cao (chạy CMD.EXE với tư cách quản trị viên). Truy vấn sổ đăng ký của bạn để biết các phông chữ TrueType có sẵn cho bảng điều khiển bằng cách:

    REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"

Bạn sẽ thấy một đầu ra như:

    0    REG_SZ    Lucida Console
    00    REG_SZ    Consolas
    936    REG_SZ    *新宋体
    932    REG_SZ    *MS ゴシック

Bây giờ chúng tôi cần thêm một phông chữ TrueType hỗ trợ các ký tự bạn cần như Courier New. Chúng tôi thực hiện điều này bằng cách thêm các số không vào tên chuỗi, vì vậy trong trường hợp này, số tiếp theo sẽ là "000":

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

Bây giờ chúng tôi triển khai hỗ trợ UTF-8:

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

Đặt phông chữ mặc định thành "Chuyển phát nhanh mới":

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

Đặt cỡ chữ thành 20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

Cho phép chỉnh sửa nhanh nếu bạn thích:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

3
Nói chung, sử dụng codepage 65001 sẽ chỉ hoạt động mà không có lỗi trong Windows 10 với bản cập nhật Người tạo. Trong Windows 7, nó sẽ có cả lỗi đầu ra và đầu vào. Trong Windows 8 và các phiên bản Windows 10 cũ hơn, nó chỉ có lỗi đầu vào, giới hạn đầu vào là ASCII 7 bit.
Eryk CN

6

Vì tôi chưa thấy câu trả lời đầy đủ nào cho Python 2.7, tôi sẽ phác thảo hai bước quan trọng và một bước tùy chọn khá hữu ích.

  1. Bạn cần một phông chữ với sự hỗ trợ Unicode. Windows đi kèm với Bảng điều khiển Lucida có thể được chọn bằng cách nhấp chuột phải vào thanh tiêu đề của dấu nhắc lệnh và nhấp vào Defaultstùy chọn. Điều này cũng cho phép truy cập vào màu sắc. Lưu ý rằng bạn cũng có thể thay đổi cài đặt cho các cửa sổ lệnh được gọi theo một số cách nhất định (ví dụ: mở tại đây, Visual Studio) bằng cách chọn Propertiesthay thế.
  2. Bạn cần đặt trang mã thành cp65001, dường như là nỗ lực của Microsoft để cung cấp hỗ trợ UTF-7 và UTF-8 cho dấu nhắc lệnh. Làm điều này bằng cách chạy chcp 65001trong dấu nhắc lệnh . Sau khi thiết lập, nó vẫn giữ nguyên như vậy cho đến khi cửa sổ được đóng lại. Bạn sẽ cần làm lại điều này mỗi khi bạn khởi chạy cmd.exe.

Để có giải pháp lâu dài hơn, hãy tham khảo câu trả lời này trên Super User. Nói tóm lại, tạo một mục REG_SZ(Chuỗi) bằng regedit tại HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processorvà đặt tên cho nó AutoRun. Thay đổi giá trị của nó thành chcp 65001. Nếu bạn không muốn xem thông báo đầu ra từ lệnh, @chcp 65001>nulthay vào đó hãy sử dụng .

Một số chương trình gặp sự cố khi tương tác với mã hóa này, MinGW là một chương trình đáng chú ý bị lỗi trong khi biên dịch với thông báo lỗi vô nghĩa. Tuy nhiên, điều này hoạt động rất tốt và không gây ra lỗi với phần lớn các chương trình.


5

Tôi thấy phương pháp này hữu ích trong các phiên bản mới của Windows 10:

Bật tính năng này: "Beta: Sử dụng Unicode UTF-8 để hỗ trợ ngôn ngữ trên toàn thế giới"

Bảng điều khiển -> Cài đặt khu vực -> Tab quản trị-> Thay đổi ngôn ngữ hệ thống ...

Cài đặt vùng


Làm thế nào để đạt được điều này bằng cách sử dụng powershell hoặc cmd?
Corey

Tôi đang cố gắng hiển thị các ký tự tiếng Trung trong bảng điều khiển và thực hiện việc này không hoạt động trên Windows 10 64 bit (Được cài đặt bằng tiếng Thổ Nhĩ Kỳ và sau đó đổi thành tiếng Anh). Tiếp theo, tôi sẽ thử cài đặt ngôn ngữ Trung Quốc và xem nó có hoạt động không.
akinuri

4

Một tùy chọn thực sự đơn giản là cài đặt Windows bash shell như MinGW và sử dụng:

Nhập mô tả hình ảnh ở đây

Có một chút về đường cong học tập vì bạn sẽ cần sử dụng chức năng dòng lệnh Unix, nhưng bạn sẽ thích sức mạnh của nó và bạn có thể đặt ký tự bàn điều khiển được đặt thành UTF-8.

Nhập mô tả hình ảnh ở đây

Tất nhiên bạn cũng nhận được tất cả các tính năng * nix thông thường như grep, find, less, v.v.


Trong trường hợp (cũ) này, vấn đề là ở một kịch bản chứ không phải là bàn điều khiển. Sử dụng các tập lệnh bash sẽ giải quyết điều này?
Vilx-

Đúng vậy, các tập lệnh bash gỗ có thể được gắn cờ là UTF-8 và chỉ hoạt động với sức mạnh lớn hơn nhiều so với các tệp bó của windows - Tôi biết rằng đó là một trường hợp cũ nhưng nghĩ rằng tùy chọn này đáng để gắn cờ để tham khảo trong tương lai vì MS dường như không để trở nên tốt hơn nhiều về Unicode.
Steve Barnes


Xuất ra các ký tự được mã hóa UTF-8 là tốt. Nhưng đầu vào vẫn được mã hóa bởi hệ thống mã hóa.
Rick

1
Chỉ cần thêm rằng người dùng Windows có thể đã có bash shell nếu bạn sử dụng Git: chỉ cần mở cửa sổ Git> Git Bash .
skomisa

3

Đối với một vấn đề tương tự, (vấn đề của tôi là hiển thị các ký tự UTF-8 từ MySQL trên dấu nhắc lệnh),

Tôi đã giải quyết nó như thế này:

  1. Tôi đã thay đổi phông chữ nhắc lệnh thành Bảng điều khiển Lucida. (Bước này phải không liên quan đến tình huống của bạn. Nó chỉ được thực hiện với những gì bạn nhìn thấy trên màn hình chứ không phải với những gì thực sự là nhân vật).

  2. Tôi đã thay đổi codepage thành Windows-1253. Bạn làm điều này trên dấu nhắc lệnh bằng "chcp 1253". Nó hoạt động cho trường hợp của tôi khi tôi muốn xem UTF-8.


7
Windws-1253 không phải là một bảng mã Unicode. Đó là một bảng mã 256 ký tự tiêu chuẩn. Rõ ràng bạn chỉ sử dụng các ký tự có thể được hiển thị trong bảng mã đó, nhưng nó sẽ không phổ biến.
Vilx-

3

Vấn đề này khá khó chịu. Tôi thường có ký tự tiếng Trung trong tên tệp và nội dung tệp. Xin lưu ý rằng tôi đang sử dụng Windows 10, đây là giải pháp của tôi:

Để hiển thị tên tệp , chẳng hạn như dirhoặc lsnếu bạn đã cài đặt Ubuntu bash trên Windows 10

  1. Đặt vùng để hỗ trợ 8 ký tự không utf.

  2. Sau đó, phông chữ của bàn điều khiển sẽ được thay đổi thành phông chữ của miền địa phương đó và nó cũng thay đổi mã hóa của bàn điều khiển.

Sau khi bạn đã thực hiện các bước trước đó, để hiển thị nội dung tệp của tệp UTF-8 bằng công cụ dòng lệnh

  1. Thay đổi trang thành utf-8 bằng chcp 65001
  2. Thay đổi phông chữ hỗ trợ utf-8, chẳng hạn như Bảng điều khiển Lucida
  3. Sử dụng typelệnh để xem lén nội dung tệp hoặc catnếu bạn đã cài đặt bash Ubuntu trên Windows 10
  4. Xin lưu ý rằng, sau khi đặt mã hóa của bàn điều khiển thành utf-8, tôi không thể nhập ký tự tiếng Trung trong cmd bằng phương thức nhập tiếng Trung.

Giải pháp lười nhất: Chỉ cần sử dụng trình giả lập bảng điều khiển như http://cmder.net/


Điều này đã không cho tôi. Các ký tự Trung Quốc trong đầu ra của pointlệnh vẫn bị cắt xén.
Ssuching Yu

@Si KhánhYu Tôi từ bỏ các thiết lập điên rồ. Chỉ cần sử dụng blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder.aspx
code4j

Tôi đã sử dụng Cmder trước đây, nhưng nó không thể thay thế bảng điều khiển dành cho nhà phát triển được sử dụng bởi Visual Studio.
Ssuching Yu

@Si KhánhYu Ý bạn là sức mạnh tương tác c #?
code4j

Không phải vỏ năng lượng tương tác, mà là bảng điều khiển dành cho nhà phát triển, được Visual C ++ sử dụng. Đây là bảng điều khiển gỡ lỗi mặc định trong các dự án Ứng dụng Bảng điều khiển Win32.
Ssuching Yu

2

Tôi thấy một số câu trả lời ở đây, nhưng dường như chúng không giải quyết được câu hỏi - người dùng muốn nhận đầu vào Unicode từ dòng lệnh.

Windows sử dụng UTF-16 để mã hóa theo hai chuỗi byte, vì vậy bạn cần lấy các chuỗi này từ HĐH trong chương trình của mình. Có hai cách để làm điều này -

1) Microsoft có một tiện ích mở rộng cho phép main lấy một mảng ký tự rộng: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/l Library / 6wd819wh.aspx

2) Gọi các cửa sổ api để lấy phiên bản unicode của dòng lệnh wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

Đọc này: http://utf8everywhere.org để biết thông tin chi tiết, đặc biệt nếu bạn đang hỗ trợ các hệ điều hành khác.


À, không, tôi xin lỗi, nhưng bạn đã bỏ lỡ câu hỏi. Điều này là khi tôi đang viết một chương trình sẽ nhận được các ký tự unicode. Câu hỏi của tôi là về việc gửi các ký tự unicode đến một chương trình khác (hy vọng hỗ trợ nhận chúng, nhưng tôi thực sự không có cách nào để biết ngoại trừ việc tháo gỡ).
Vilx-

2

Bắt đầu từ tháng 6 năm 2019, với Windows 10, bạn sẽ không phải thay đổi bảng mã.

Xem " Giới thiệu Windows Terminal " (từ Kayla Cinnamon ) và Microsoft / Terminal .
Thông qua việc sử dụng phông chữ Consolas, hỗ trợ Unicode một phần sẽ được cung cấp.

Như tài liệu trong Microsoft/Terminalsố 387 :

Có 87.887 chữ tượng hình hiện tại bằng Unicode. Bạn cần tất cả chúng quá?
Chúng ta cần một ranh giới và các ký tự nằm ngoài ranh giới đó phải được xử lý bằng phông chữ dự phòng / liên kết phông chữ / bất cứ thứ gì.

Những gì Consolas nên bao gồm:

  • Các ký tự được sử dụng làm biểu tượng được sử dụng bởi các chương trình OSS hiện đại trong CLI.
  • Các nhân vật này phải tuân theo thiết kế và số liệu của Consolas và được căn chỉnh phù hợp với các nhân vật Consolas hiện có.

Những gì Consolas KHÔNG nên bao gồm:

  • Các ký tự và dấu chấm câu của các chữ viết vượt ra ngoài tiếng Latin, tiếng Hy Lạp và Cyrillic, đặc biệt là các ký tự cần tạo hình phức tạp (như tiếng Ả Rập).
  • Những ký tự này nên được xử lý với dự phòng phông chữ.

1

Một quyết định nhanh chóng cho các tệp .bat nếu máy tính của bạn hiển thị đúng đường dẫn / tên tệp của bạn khi bạn nhập nó vào cửa sổ DOS:

  1. sao chép con temp.txt [nhấn Enter]
  2. Nhập tên đường dẫn / tên tệp [nhấn Enter]
  3. Nhấn Ctrl-Z [nhấn Enter]

Bằng cách này, bạn tạo tệp .txt - temp.txt. Mở nó trong Notepad, sao chép văn bản (đừng lo lắng nó sẽ trông không thể đọc được) và dán nó vào tệp .bat của bạn. Việc thực thi .bat được tạo theo cách này trong cửa sổ DOS hoạt động cho mе (Cyrillic, tiếng Bulgaria).


1

Một điều tốt hơn để làm: Chỉ cần cài đặt gói ngôn ngữ tiếng Nhật có sẵn, miễn phí. (Các gói ngôn ngữ phương Đông khác cũng sẽ hoạt động, nhưng tôi đã thử nghiệm tiếng Nhật.)

Điều này cung cấp cho bạn các phông chữ với các bộ glyphs lớn hơn, biến chúng thành hành vi mặc định, thay đổi các công cụ Windows khác nhau như cmd, Wordman, v.v.


1

Thay đổi trang mã thành 1252 đang làm việc cho tôi. Vấn đề đối với tôi là trình đào kép biểu tượng § đang chuyển đổi sang biểu tượng khác của DOS trên Windows Server 2008.

Tôi đã sử dụng CHCP 1252 và giới hạn trước nó trong tuyên bố BCP của mình ^ §.


Cảm ơn nó hoạt động! Tôi không biết tại sao mọi người bỏ phiếu này, đây là một lựa chọn hợp lệ cho một số người .. Bản mã 1252 này cũng khắc phục vấn đề trên Windows Server 2012, trong đó mã tương tự với CP 65001 không hoạt động với tôi. Tôi cho rằng nó phụ thuộc vào việc mã hóa tập lệnh bó nào đã được chỉnh sửa hoặc mặc định của hệ điều hành. Trong trường hợp này, nó được tạo bằng Notepad trên máy MUI của Đức với hệ điều hành cơ sở tại Hoa Kỳ ..
Tony Wall

0

Tôi đã khắc phục một vấn đề tương tự khi xóa các tệp có tên Unicode bằng cách tham chiếu chúng trong tệp bó theo tên ngắn (8 chấm 3) của chúng.

Các tên ngắn có thể được xem bằng cách làm dir /x. Rõ ràng, điều này chỉ hoạt động với tên tệp Unicode đã được biết đến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.