【问题标题】:c# reading Hebrew text from consolec# 从控制台读取希伯来语文本
【发布时间】:2018-08-02 12:21:46
【问题描述】:

我使用的是 Windows 10(也许这是问题所在:-))

我有一个简单的代码,可以从控制台读取希伯来语文本,然后打印它的 HEX\DEC 值

但他一直给我00 在控制台窗口上我可以看到希伯来字母

有什么理由吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Net;
using System.Net.Sockets;
using System.Timers;
using System.IO;

namespace HebTest
{
    class Program
    {
        static public void Main(string[] args)
        {

            Console.WriteLine("Write your message here  - ");

            string StringMessage = Console.ReadLine();


            Console.WriteLine("print string  - " + StringMessage);
            ///message in HEX
            byte [] ByteMessage = Encoding.Default.GetBytes(StringMessage);
            string HexMessage = BitConverter.ToString(ByteMessage); 

            Console.WriteLine("MSG in HEX -  " + HexMessage);
            Console.Write( 
                          Encoding.Default.GetString(ByteMessage)                   
                          );

            Console.WriteLine();
            foreach (byte p in ByteMessage)
            {
                Console.Write((char)p + "  -  " +  p );
                Console.WriteLine("");


            }

}

例如我输入这个文本 “测试אבגד” 这就是我得到的:

Write your message here  -
test אבגד                         ---> this I wrote on the console
print string  - test
MSG in HEX -  74-65-73-74-20-00-00-00-00
test     
t  -  116
e  -  101
s  -  115
t  -  116
   -  32
   -  0
   -  0
   -  0
   -  0

我错过了什么?

谢谢,

【问题讨论】:

  • 这几乎肯定是问题所在:byte [] ByteMessage = Encoding.Default.GetBytes(StringMessage);。您的系统默认编码是什么,它可以处理希伯来语字符吗?您想要查看结果的编码是什么? (你真的要使用编码吗?这里更大的目标是什么?)
  • 1.我怎么知道我的系统默认编码是什么? - 我猜是希伯来语 - 但我不知道。你可以在屏幕上看到希伯来语\在记事本上\等... 2. 我想成为 abel 看到我输入的消息\字符 3. 有趣的部分是 - 它昨天对我有用 - 然后 windows10 决定重新启动因为一些愚蠢的更新 - 今天它没有工作.....那该怎么办\检查? ***** 我看了 - 时钟和区域 - 区域设置 - 当前系统语言环境 - 希伯来语,也是 beta:使用 Unicode UTF 是标记
  • 与其找出Encoding.Default 是什么,我会问自己你真正想要实现的目标是什么。您想要结果的编码是什么?你需要编码吗?您可以直接打印出 Unicode 字符编号,而不将字符串编码为 byte[] 吗?
  • 我需要将 HEX 值发送到外部设备 - 这就是为什么我需要查看正确的编码.....
  • 那么外部设备期望的编码是什么?出于诊断目的,您可以从显式使用 Encoding.UTF8 开始,但您确实需要知道设备期望什么。

标签: c# character-encoding hebrew


【解决方案1】:

您正在使用Encoding.Default 将字符串转换为二进制。这几乎总是一个坏主意——这意味着相同的代码可能在某些机器上运行,而在其他机器上则不行。 当您想在该机器上读取/写入文本文件时非常有用,并且您确定系统默认编码是正确的任何运行它的机器。这很少见。

特别是,您正在尝试与外部设备通信 - 这意味着您需要使用 it 期望的编码。你应该找出来,并使用适当的编码。例如,如果设备需要 UTF-8,请使用:

// Local variable names changed to be more idiomatic C#
string text = Console.ReadLine();
byte[] bytes = Encoding.UTF8.GetBytes(text);

正如您现在指出的设备需要 Windows-1255,即代码页 1255,因此您得到的编码如下:

Encoding.GetEncoding(1255)

为了澄清,我可能会为此使用一个单独的变量:

string text = Console.ReadLine();
Encoding encoding = Encoding.GetEncoding(1255);
byte[] bytes = encoding.GetBytes(text);

【讨论】:

  • 外部设备正在使用“Windows-1255” - 我如何使用它在编码中没有选项。 ?
  • @David12123:我相信在这种情况下你需要Encoding.GetEncoding(1255)
  • (我现在已将其添加到我的答案中。)
  • 好的 - 不知道我能做到这一点 :-) - 它正在工作 谢谢,现在我想阅读一个文本文件 - 我应该发布一个新问题吗?我使用字符串 Textmessage = File.ReadAllText (path) ,其余代码是相同的-但我得到了??????而不是任何希伯来语单词
  • @David12123:提示:查看File.ReadAllText 的重载。但如果这还不够,那么可以,作为新问题提出。
【解决方案2】:

发现问题(@Daisy Shipton 让我想想之后)

代码没问题 需要去 控制面板-区域-管理-系统区域设置-

在 Beta 版上移除 V:使用 Unicode UTF-8 获得全球语言支持

希望有一天能对某人有所帮助

【讨论】:

  • 不,代码不是好的。它使用系统默认编码,这几乎是从不正确的做法,也不适合您的设备。相反,找出您真正想要使用的编码并明确设置。
  • 好的 - 告诉我,如何让它在希伯来语中工作?我需要改变什么?我在哪里可以找到正确的编码?我知道它应该是“windows-1255”——那该怎么办?谢谢
  • 查看我对我的回答的评论的回复。
  • @David12123 在系统语言环境中启用 UTF8 会破坏一些东西,包括一些 Visual Studio 扩展。它是测试版是有原因的。应用程序期望字符串是 Unicode 或单字节。开发人员需要时间来发现他们的哪些应用程序以 UTF8 作为默认代码页而中断
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-08-21
  • 2016-03-16
  • 1970-01-01
  • 2017-07-24
  • 2011-01-30
  • 2011-09-02
相关资源
最近更新 更多