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(); } }
问题
- DateTime格式中替换空格的是何种字符或编码?
- 如何修改配置以避免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):
- 打开控制台,执行命令:
chcp 65001 - 再运行你的程序,即可正确显示字符。
注意:这种修改仅对当前控制台会话有效,重启控制台后会恢复默认编码。
内容的提问来源于stack exchange,提问作者iEligio




