View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002372 | Far Manager | Macro | public | 2013-04-17 11:58 | 2013-04-18 09: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 11:58 | JohnDoe | New Issue | |
| 2013-04-17 12:51 | alexy | Project | Far Manager => Plugins |
| 2013-04-17 12:52 | alexy | Project | Plugins => Far Manager |
| 2013-04-17 13:11 | 2useven10 | File Added: slnunico.diff | |
| 2013-04-17 13:11 | 2useven10 | Note Added: 0010821 | |
| 2013-04-17 14:32 | shmuel | Assigned To | => shmuel |
| 2013-04-17 14:32 | shmuel | Status | new => assigned |
| 2013-04-17 14:51 | 2useven10 | Summary | string:format неправильно учитывет длину юникодной строки. => string:format неправильно учитывает длину юникодной строки. |
| 2013-04-17 15:37 | shmuel | Note Added: 0010826 | |
| 2013-04-17 17:29 | 2useven10 | Note Added: 0010829 | |
| 2013-04-17 18:08 | 2useven10 | Note Edited: 0010829 | |
| 2013-04-17 21:43 | shmuel | Note Added: 0010833 | |
| 2013-04-17 21:43 | shmuel | Status | assigned => feedback |
| 2013-04-18 08:01 | JohnDoe | Note Added: 0010846 | |
| 2013-04-18 08:01 | JohnDoe | Status | feedback => assigned |
| 2013-04-18 08:01 | JohnDoe | Status | assigned => resolved |
| 2013-04-18 09:38 | shmuel | Build | => 3346 |
| 2013-04-18 09:38 | shmuel | Status | resolved => closed |
| 2013-04-18 09:38 | shmuel | Resolution | open => fixed |
| 2013-04-18 09:38 | shmuel | Fixed in Version | => 3.0 |