You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10路径中非拉丁字符显示异常:Python临时目录返回短路径问题

问题解析与解决方案

为什么会出现"3EC2~1"?

这是Windows的8.3短文件名格式,是微软为兼容DOS和早期Windows系统的旧规则(文件名最多8个字符主名+3个字符扩展名)设计的。

对于包含西里尔文这类非ASCII字符的长文件名,Windows不会通过常规编码转换生成短名称,而是通过算法生成:先对长文件名的Unicode内容计算哈希值("3EC2"就是这个哈希的十六进制片段),再加上~1这类序号(避免重名),最终生成符合8.3规则的短文件名。所以你用普通编码器转"Антон"肯定得不到这个结果——它根本不是编码转换来的。

怎么让Python返回带完整用户名的路径?

有几种简单方法可以获取长路径:

方法1:用ctypes调用Windows原生API

不用装额外库,直接调用系统API把短路径转成长路径:

import os
import ctypes
from ctypes import wintypes

def get_long_path(short_path):
    # 先获取需要的缓冲区大小
    buf_size = wintypes.DWORD(0)
    ctypes.windll.kernel32.GetLongPathNameW(wintypes.LPCWSTR(short_path), None, buf_size)
    # 分配缓冲区并获取长路径
    buf = ctypes.create_unicode_buffer(buf_size.value)
    ctypes.windll.kernel32.GetLongPathNameW(wintypes.LPCWSTR(short_path), buf, buf_size)
    return buf.value

# 转换临时目录为长路径,再拼接文件
temp_dir = get_long_path(os.gettempdir())
storage_path = os.path.join(temp_dir, 'storage.json')
print(storage_path)

方法2:用pywin32库(需额外安装)

如果你的项目允许装第三方库,pywin32会更简洁:

import os
import win32api

temp_dir = win32api.GetLongPathName(os.gettempdir())
storage_path = os.path.join(temp_dir, 'storage.json')
print(storage_path)

方法3:直接从环境变量构造路径

跳过gettempdir(),直接用系统环境变量拿到完整用户目录,再拼接临时文件夹路径:

import os
# 从环境变量获取完整用户目录
user_dir = os.environ['USERPROFILE']
temp_dir = os.path.join(user_dir, 'AppData', 'Local', 'Temp')
storage_path = os.path.join(temp_dir, 'storage.json')
print(storage_path)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:22:31