You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

DateTime格式空格替换字符/编码及es-CO文化显示未知字符问题

关于西班牙语系文化(es-CO)下DateTime控制台显示未知字符的问题

我在测试西班牙语系各类文化区域(含拉丁美洲及南美部分文化)的日期显示时发现:使用es-MX(墨西哥)文化时,控制台能正确显示日期;切换为es-CO(哥伦比亚)文化时,控制台出现未知字符。

对应的测试代码及结果如下:

es-MX 文化测试代码

class Program
{
    static void Main(string[] args)
    {
        //Mexico Culture
        CultureInfo culture = new CultureInfo("es-MX");
        DateTime today = DateTime.Today;

        string dateFormat = today.ToString(culture);
        Console.WriteLine(dateFormat);

        //Result: 02/04/2025 12:00:00 a. m.

        Console.ReadLine();
    }
}

es-CO 文化测试代码

class Program
{
    static void Main(string[] args)
    {
        //Colombia Culture
        CultureInfo culture = new CultureInfo("es-CO");
        DateTime today = DateTime.Today;

        string dateFormat = today.ToString(culture);
        Console.WriteLine(dateFormat);

        //Result: 2/04/2025 12:00:00?a.?m.

        Console.ReadLine();
    }
}

问题

  1. DateTime格式中替换空格的是何种字符或编码?
  2. 如何修改配置以避免es-CO文化下出现未知字符?

问题1:替换空格的字符是什么?

es-CO文化中,日期格式里“a. m.”前后的不是普通空格,而是不间断空格(Non-breaking Space),对应的Unicode编码为U+00A0。这种空格的设计目的是防止“a.”和“m.”在换行时被拆分,但Windows控制台默认使用的编码(通常是GBK或OEM编码)不支持该Unicode字符,因此会显示为未知的?符号。

问题2:解决方法

有几种简单可行的方式解决这个控制台显示问题:

方法1:设置控制台输出编码为UTF-8

在程序开头添加编码设置,让控制台支持Unicode字符:

Console.OutputEncoding = System.Text.Encoding.UTF8;

修改后的es-CO测试代码:

class Program
{
    static void Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;
        //Colombia Culture
        CultureInfo culture = new CultureInfo("es-CO");
        DateTime today = DateTime.Today;

        string dateFormat = today.ToString(culture);
        Console.WriteLine(dateFormat);

        // 现在会正确显示:2/04/2025 12:00:00 a. m.
        Console.ReadLine();
    }
}

方法2:替换不间断空格为普通空格

如果不需要保留不间断空格的换行防拆分功能,可以手动将字符串中的U+00A0替换为普通空格(U+0020):

string dateFormat = today.ToString(culture).Replace('\u00A0', ' ');

方法3:修改控制台默认代码页

通过控制台命令临时切换到UTF-8代码页(代码页65001):

  1. 打开控制台,执行命令:chcp 65001
  2. 再运行你的程序,即可正确显示字符。

注意:这种修改仅对当前控制台会话有效,重启控制台后会恢复默认编码。


内容的提问来源于stack exchange,提问作者iEligio

火山引擎 最新活动