View Issue Details

IDProjectCategoryView StatusLast Update
0002372Far ManagerMacropublic2013-04-18 10:38
ReporterJohnDoe Assigned Toshmuel  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0002372: string:format неправильно учитывает длину юникодной строки.
DescriptionФункция format работает не с фактической длиной строки, а длиной её юникодного представления (utf-8).

Следствие: неверно выравниваются строки.
Steps To Reproducelm:post far.Show( ("%-10s -"):format("qw"), ("%-10s -"):format("фы") )
Additional Informationhttp://forum.farmanager.com/viewtopic.php?p=108081#p108081
TagsNo tags attached.
Build3346

Activities

2useven10

2013-04-17 14:11

developer  

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;
 					}
slnunico.diff (1,186 bytes)   

2useven10

2013-04-17 14:11

developer   bugnote:0010821

если забить на ансишность сорсов - фикс вроде работает.

shmuel

2013-04-17 16:37

developer   bugnote:0010826

А что значит "ансишность сорсов" ?

2useven10

2013-04-17 18:29

developer   bugnote:0010829

Last edited: 2013-04-17 19:08

я думал, что использовать в луашных сорсах прямые вызовы win апи это моветон...
но так как у тебя тоже есть такие вызовы, видимо, это не проблема.

shmuel

2013-04-17 22:43

developer   bugnote:0010833

Вроде сделал, проверяйте. Идея - та же, что и в предложенном патче.

JohnDoe

2013-04-18 09:01

updater   bugnote:0010846

Вроде бы работает

Issue History

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