我们在Team Foundation Server(TFS)中有一个项目,其中包含非英语字符(š).当我试图编写一些与构建相关的东西时,我们偶然发现了一个问题 - 我们无法将š字母传递给命令行工具.命令提示符或其他什么不是搞砸了,并且tf.exe实用程序找不到指定的项目.
我已经尝试了.bat文件的不同格式(ANSI,带有和不带BOM的 UTF-8 )以及用JavaScript编写脚本(这本身就是Unicode) - 但没有运气.如何执行程序并将其传递给Unicode命令行?
默认情况下,当您将命令的输出重定向到文件或将其传递到PowerShell中的其他内容时,编码为UTF-16,这是无用的.我想把它改成UTF-8.
它可以通过替换>foo.txt语法来逐个进行,| out-file foo.txt -encoding utf8但是每次都必须重复这是很尴尬的.
在PowerShell中设置内容的持久方法是将它们放入\Users\me\Documents\WindowsPowerShell\profile.ps1; 我已经验证这个文件确实是在启动时执行的.
有人说输出编码可以设置,$PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}但我已经尝试过,它没有任何效果.
https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/谈到$OutputEncoding乍一看似乎应该是相关的,但后来谈到输出被编码在ASCII中,这不是实际发生的事情.
如何设置PowerShell使用UTF-8?
任何人都可以告诉我覆盖大部分unicode字符的等宽字体如果不是那么包含大部分欧洲语言字符集的等宽字体?
大家好,
作为控制台/终端爱好者和数据库管理员 (PostgreSQL),使用正确的字符编码对我来说至关重要。因此,我希望我的客户端控制台/终端窗口始终设置为例如 UTF-8。
回到 Windows 的 CMD.EXE,这个尝试就像输入命令chcp 65001来设置所需的代码页标识符一样简单。现在,我正在切换到 PowerShell 并且设置字符编码似乎很奇怪,恕我直言。
我已经对如何将 PowerShell 会话设置为 UTF-8 进行了一些研究,我发现我需要三个步骤/命令来完成它。
PS C:\> $OutputEncoding = [System.Text.Encoding]::UTF8
PS C:\> [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
PS C:\> chcp 65001
Run Code Online (Sandbox Code Playgroud)
尽管前两个命令不直观且难以记住...遗漏其中一个命令会导致无法正常工作!此外,仅设置其中一个似乎对其他人没有影响。
因此,我必须设置所有三个以使用 PostgreSQL 的psql数据库客户端。否则我在导出/导入数据时会遇到编码问题。
现在我的问题是:“为什么?难道没有更简单的方法可以在 PowerShell 中简单地设置字符编码吗?” 不幸的是,我自己没有找到任何关于设置字符编码的合理文档!
提前致谢
TheIncorrigible1的第二条评论让我得到了迄今为止最好的答案:在 Powershell 中显示 Unicode - 因此可以将整个 PowerShell 与两个单独的语句设置为所需的编码 (UTF-8)。
PS C:\> $OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8
PS C:\> $PSDefaultParameterValues['*:Encoding'] = 'utf8'
Run Code Online (Sandbox Code Playgroud)
$OutputEncoding设置例如|(管道)和/或程序和/或进程之间的通信的编码。 …让我们看看这个:
\n\n\xe2\x9c\x93 Hello, \xe4\xb8\x96\xe7\x95\x8c\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,有一个 unicode 复选标记和中文/日文字符。在 go 中,如果我使用 MSYS 或 linux 环境,我可以轻松打印这些字符。即使在窗户上。但是,我无法在CMD或 中看到它们Powershell。
我懂了:
\n\n\n\n这是我非常基本的代码:
\n\npackage main\n\nimport (\n "fmt"\n)\n\nfunc main() {\n\n fmt.Println("\xe2\x9c\x93 Hello, \xe4\xb8\x96\xe7\x95\x8c")\n // OR\n fmt.Println("\\u2713 Hello, \xe4\xb8\x96\xe7\x95\x8c")\n}\nRun Code Online (Sandbox Code Playgroud)\n\n此外,我有数十个控制台应用程序,它们能够使用 cmd 或 powershell 在我的窗口上显示此类字符。为什么去不了?
\n我正在尝试通过以下方式重定向 PowerShell 中的输入:
Get-Content input.txt | my-program args
Run Code Online (Sandbox Code Playgroud)
问题是管道 UTF-8 文本前面有一个 BOM (0xEFBBBF),我的程序无法正确处理它。
一个最小的工作示例:
// File: Hex.java
import java.io.IOException;
public class Hex {
public static void main(String[] dummy) {
int ch;
try {
while ((ch = System.in.read()) != -1) {
System.out.print(String.format("%02X ", ch));
}
} catch (IOException e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 PowerShell 中:
javac Hex.java
Set-Content textfile "ABC" -Encoding Ascii
# Now the content of textfile is 0x41 42 43 0D 0A
Get-Content textfile | java Hex
Run Code Online (Sandbox Code Playgroud)
或者干脆 …
我已经chcp 65001在命令提示符和Windows Powershell中强制使用了一段时间,但是从SO和其他几个社区的问答环节来看,这似乎是一种危险且低效的解决方案。Microsoft是否提供一种chcp 65001可以永久保存而无需手动更改注册表的改进/完整替代方案?如果没有,将来是否有公开宣布的时间表或议程来支持Windows CLI中的UTF-8?
我个人已经使用了chcp 949韩国字符支持,但反斜线的怪异显示\在多个应用程序(如Neovim),以及字符和不正确/难以理解的显示器是不是韩国未通过支持949似乎变得更加的最近有问题。
我正在尝试从 Kotlin 程序(在控制台上运行)打印希伯来语字符。
\n所有希伯来字符都作为问号输出。
\n我创建了以下简单的test.kts脚本文件进行测试:
println("\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f")\n\n// Try to print a simple non-Hebrew character too\nprintln("\\u0394") // Greek Delta\nRun Code Online (Sandbox Code Playgroud)\n文件已正确保存为 UTF-8 格式。
\n它打印:
\n???? ???????\n?\nRun Code Online (Sandbox Code Playgroud)\n我尝试在命令提示符、PowerShell(在其本机窗口和 Windows 终端中)和 Git Bash 中运行它,所有这些都给出相同的结果。我还尝试将输出重定向到文件以排除 shell 中的显示问题。
\n为了确保问题不是控制台本身的问题,我还制作了简单的test.bat、test.ps1、 和test.sh文件,其中包含以下内容:
echo "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f"\nRun Code Online (Sandbox Code Playgroud)\n所有三个 shell 都正确显示了希伯来语文本,表明问题出在 Kotlin 的输出中,而不是 shell 显示中。(虽然 PowerShell 要求文件保存为“UTF-8 with BOM”才能正确显示,但这不是 Kotlin 的问题,因为 Kotlin 甚至不会运行使用 BOM 保存的脚本。)
\n据我所知,Kotlin 应该默认支持 UTF-8 输出,无需配置。
\n我怎样才能得到正确的输出?
\n …我有一个简单的 javascript 文件(我们称之为 index.js),其中包含以下内容:
\nconsole.log('p\xc3\xa9rola');\nRun Code Online (Sandbox Code Playgroud)\n我在 Windows 10 上使用 VSCode,当我使用以下命令执行文件时,它使用 powershell 作为终端:
\nnode index.js\nRun Code Online (Sandbox Code Playgroud)\n我得到以下输出:
\np\xc3\xa9rola\nRun Code Online (Sandbox Code Playgroud)\n如果我运行以下命令:
\nnode index.js > output.txt\nRun Code Online (Sandbox Code Playgroud)\n我在文件中得到以下信息:
\np\xe2\x94\x9c\xc2\xaerola\nRun Code Online (Sandbox Code Playgroud)\n写入文件时,powershell 的编码似乎存在一些问题,当我在 VSCode 上打开文件时,我可以在右下角看到编码是 UTF-16 LE。
\n我也已经尝试过以下操作:
\nnode index.js | out-file -encoding utf8 output.txt\nRun Code Online (Sandbox Code Playgroud)\n该文件以带有 BOM 的 UTF8 格式保存,但编码仍然错误,因为我看到的是p\xe2\x94\x9c\xc2\xaerola而不是p\xc3\xa9rola
\n有人可以解释一下这里出了什么问题吗?\n谢谢。
\n这不是与此相关的其他各种问题的重复(我回顾了它们,但在我看到的问题中没有得到回答)。这些其他问题都围绕着Out-Host -Paging(more即使它们less在问题标题中提到)。
为了关注这一特定点,有谁知道less在 Microsoft Windows 环境下复制 的功能的 PowerShell 方法吗?即使我们能够向下和向上滚动文档(使用光标键逐行或使用 PgUp / PgDn 键逐页)以查看帮助和其他文件(例如,以便我们可以执行操作Get-Help Get-ChildItem -Full | less)。
这将非常有用。我并不追求lessWindows 的第 3 方可执行工具(因为它不会启用管道等)(当然有很多)。我相信 PSCX 中有这样的东西,但每当我尝试安装它时,我都会看到很多冲突,并且我不确定是否使用它,-AllowClobber以防它破坏其他东西。也许在这一点上,如果有的less话,有没有人能够分离出该功能并独立于 PSCX 使用?
我有一个文本文件input.xlf
<trans-unit id="loco:5e7257a0c38e0f5b456bae94">\n <source>Login</source>\n <target>\xe7\x99\xbb\xe5\x85\xa5</target>\n <note>Login Header</note>\n </trans-unit>\nRun Code Online (Sandbox Code Playgroud)\n基本上我需要<用<和替换>\'>\',所以我运行下面的脚本
跑步者.bat
\npowershell -Command "(gc input.xlf) -replace \'<\', \'<\' | Out-File -encoding ASCII output.xlf";\npowershell -Command "(gc output.xlf) -replace \'>\', \'>\' | Out-File -encoding ASCII output.xlf";\nRun Code Online (Sandbox Code Playgroud)\n上面的内容一直有效,直到我注意到下面的输出
\n <trans-unit id="loco:5e7257a0c38e0f5b456bae94">\n <source>Login</source>\n <target>??????</target>\n <note>Login Header</note>\n </trans-unit>\n\nRun Code Online (Sandbox Code Playgroud)\n我尝试删除编码,但现在我得到了
\n <trans-unit id="loco:5e7257a0c38e0f5b456bae94">\n <source>Login</source>\n <target>\xc3\xa7\xe2\x84\xa2\xc2\xbb\xc3\xa5\xe2\x80\xa6\xc2\xa5</target>\n <note>Login Header</note> \n </trans-unit>\n\nRun Code Online (Sandbox Code Playgroud)\n以下是我想要的输出
\n <trans-unit id="loco:5e7257a0c38e0f5b456bae94">\n <source>Login</source>\n <target>\xe7\x99\xbb\xe5\x85\xa5</target>\n <note>Login Header</note>\n </trans-unit>\nRun Code Online (Sandbox Code Playgroud)\n 如果我运行这样的命令:
Write-Output March > a.txt
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
U+FEFF
M U+004D
a U+0061
r U+0072
c U+0063
h U+0068
U+000D
\n U+000A
Run Code Online (Sandbox Code Playgroud)
我不想要 BOM。我尝试了不同的操作,如下所示:
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
Run Code Online (Sandbox Code Playgroud)
但他们似乎都没有解决这个问题。注意我使用的是 PowerShell 5.1。我确实看到了一些类似的问题,但与此不完全相同,因为他们正在处理管道和外部命令。
powershell ×9
utf-8 ×4
console ×2
encoding ×2
unicode ×2
windows ×2
automation ×1
cmd ×1
command-line ×1
fonts ×1
go ×1
input ×1
kotlin ×1
node.js ×1
pipe ×1
postgresql ×1