View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002372 | Far Manager | Macro | public | 2013-04-17 12:58 | 2013-04-18 10:38 |
Reporter | JohnDoe | Assigned To | shmuel | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0002372: string:format неправильно учитывает длину юникодной строки. | ||||
Description | Функция format работает не с фактической длиной строки, а длиной её юникодного представления (utf-8). Следствие: неверно выравниваются строки. | ||||
Steps To Reproduce | lm:post far.Show( ("%-10s -"):format("qw"), ("%-10s -"):format("фы") ) | ||||
Additional Information | http://forum.farmanager.com/viewtopic.php?p=108081#p108081 | ||||
Tags | No tags attached. | ||||
Build | 3346 | ||||
|
slnunico.diff (1,186 bytes)
Index: slnunico.c =================================================================== --- slnunico.c (revision 10089) +++ slnunico.c (working copy) @@ -117,6 +117,8 @@ #include "lauxlib.h" #include "lualib.h" +#include <windows.h> + /* ** maximum number of captures that a pattern can do during ** pattern-matching. This limit is arbitrary. @@ -1661,6 +1663,7 @@ { size_t l; const char *s = luaL_checklstring(L, arg, &l); + int nw = MultiByteToWideChar(CP_UTF8, 0, s,l, NULL, 0); if(!hasprecision && l >= 100) { @@ -1675,7 +1678,16 @@ #ifdef LUA_USE_SNPRINTF snprintf(buff, MAX_ITEM, form, s); #else - sprintf(buff, form, s); + if ((size_t)nw >= l) + sprintf(buff, form, s); + else { + wchar_t ws[100], wf[256], wb[512]; + int nwo; + MultiByteToWideChar(CP_UTF8, 0, form,-1, wf, sizeof(wf)/sizeof(wf[0])); + MultiByteToWideChar(CP_UTF8, 0, s,-1, ws, sizeof(ws)/sizeof(ws[0])); + nwo = _snwprintf_s(wb, sizeof(wb)/sizeof(wb[0]), sizeof(wb)/sizeof(wb[0]), wf, ws); + WideCharToMultiByte(CP_UTF8, 0, wb,-1, buff,MAX_ITEM, NULL, NULL); + } #endif break; } |
|
если забить на ансишность сорсов - фикс вроде работает. |
|
А что значит "ансишность сорсов" ? |
|
я думал, что использовать в луашных сорсах прямые вызовы win апи это моветон... но так как у тебя тоже есть такие вызовы, видимо, это не проблема. |
|
Вроде сделал, проверяйте. Идея - та же, что и в предложенном патче. |
|
Вроде бы работает |
Date Modified | Username | Field | Change |
---|---|---|---|
2013-04-17 12:58 | JohnDoe | New Issue | |
2013-04-17 13:51 | alexy | Project | Far Manager => Plugins |
2013-04-17 13:52 | alexy | Project | Plugins => Far Manager |
2013-04-17 14:11 | 2useven10 | File Added: slnunico.diff | |
2013-04-17 14:11 | 2useven10 | Note Added: 0010821 | |
2013-04-17 15:32 | shmuel | Assigned To | => shmuel |
2013-04-17 15:32 | shmuel | Status | new => assigned |
2013-04-17 15:51 | 2useven10 | Summary | string:format неправильно учитывет длину юникодной строки. => string:format неправильно учитывает длину юникодной строки. |
2013-04-17 16:37 | shmuel | Note Added: 0010826 | |
2013-04-17 18:29 | 2useven10 | Note Added: 0010829 | |
2013-04-17 19:08 | 2useven10 | Note Edited: 0010829 | |
2013-04-17 22:43 | shmuel | Note Added: 0010833 | |
2013-04-17 22:43 | shmuel | Status | assigned => feedback |
2013-04-18 09:01 | JohnDoe | Note Added: 0010846 | |
2013-04-18 09:01 | JohnDoe | Status | feedback => assigned |
2013-04-18 09:01 | JohnDoe | Status | assigned => resolved |
2013-04-18 10:38 | shmuel | Build | => 3346 |
2013-04-18 10:38 | shmuel | Status | resolved => closed |
2013-04-18 10:38 | shmuel | Resolution | open => fixed |
2013-04-18 10:38 | shmuel | Fixed in Version | => 3.0 |