-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FT_Exception: (cannot open resource) - non-english file path #157
Comments
Try |
I try the two method you have suggest. Both of them give me the same exception. freetype.Face("C:\\Windows\\Fonts\\حُرّ عادي.ttf")
freetype.Face("C:/Windows/Fonts/حُرّ عادي.ttf") |
Can you print here what is |
It print me this (so the exact same thing that I provide): |
Is is a |
No, simply a path. It will instanciate a windows path since I am on windows: https://docs.python.org/3/library/pathlib.html |
AFAIK it needs to be something acceptable to windows' c runtime's Python 3 is unicode internally and needs some encoding on all platforms. Unix's takes utf8, while some windows internal bits are utf16. You might be able to experiment by playing with python ctypes on Windows directly. I am afraid this is one area where playing with wine does not help, and wine differs slightly in behavior compared to windows. Ie running windows python on wine is no help. |
@HinTak We could use pathlib internally and we would be on the safe side, no? |
@rougier yes, apparently it is included in python standard library since 3.4 (and we had a separate frozen-ish 2.x branch). If anybody cares enough about older 3.x, they should do their own thing and/or submit a pull. That said, we really want to know why it doesn't work on Windows with non-ascii paths. The "/" vs "" (and needing to double "\" or switch to "/") is relatively well known. Win32 IO have ascii vs unicode IO routines, but I don't think freetype uses those. Thinking about it, @moi15moi , where did you get your libfreetype.dll? I am wondering if msvc compiled ones uses the win32 routines. I am quite sure mingw built ones don't. |
I don't know what you are talking about. I just install freetype-py like this: |
@moi15moi argh, sorry somebody else among the team did the bundled binaries. According to https://pypi.org/project/freetype-py/#description , it is probably msvc (=visual studio) + cmake -built. |
I agree it would be good to know why it fails. See also https://jod.al/2019/12/10/pathlib-and-paths-with-arbitrary-bytes/ |
I was just reminded of a somewhat similar issue in a different project I work on: The two questions are mainly what bytes as a file name FreeType receives, and can one open a file with those bytes via fopen. |
Can't we use the pathlib library to solve the translation problem for us then? |
I encountered the same problem, and it was solved by changing the encoding of line 162 of freetype/init.py to ansi def _encode_filename(filename):
# encoded = filename.encode(sys.getfilesystemencoding())
encoded = filename.encode('ansi')
if "?" not in filename and b"?" in encoded:
# A bug, decoding mbcs always ignore exception, still isn't fixed in Python 2,
# view http://bugs.python.org/issue850997 for detail
raise UnicodeError()
return encoded |
This is not a good idea. |
@rougier Have you found any alternative? |
I just found this issue: https://gitlab.freedesktop.org/freetype/freetype/-/issues/1098 |
No, you did not notice the "won't fix" label on the issue you referenced. :-). |
Exactly. Then, when the font filename contain an non ascii char and the platform is windows, we could simply create a memory font. |
Not sure what you are asking for. It is the same as what you did, |
freetype.Face() seems to not take non-ascii path. It will raise an exception.
With a string path
With an BufferedReader
The text was updated successfully, but these errors were encountered: