I have recently converted the character set to UTF-8 on my forum.
- Uncommented the UTF-8 line in config.php
- Changed the char set settings in AdminCP -> Languages to UTF-8
- Converted whole database (as well as tables and their columns) to utf8_general_ci collation from latin1
- Updated Thread info, Forum info and Usernames from Maintenance -> General Update tools
Now when I try to edit a user with special characters in admincp, it gives an error saying another user exists with the same username (with no special characters).
It seems this is the code from class_dm_user.php file that check the usernames while saving the user:
PHP Code:
function verify_username(&$username)
{
// fix extra whitespace and invisible ascii stuff
$username = trim(preg_replace('#[ \r\n\t]+#si', ' ', strip_blank_ascii($username, ' ')));
$username_raw = $username;
$charset = vB_Template_Runtime::fetchStyleVar('charset');
$callback = new Convert_unicode_char_to_charset_callback($charset);
$username = preg_replace_callback(
'/&#([0-9]+);/i',
array($callback, 'callback'),
$username
);
$username = preg_replace_callback(
'/�*([0-9]{1,2}|1[01][0-9]|12[0-7]);/i',
'convert_int_to_utf8_callback',
$username
);
$username = str_replace(chr(0), '', $username);
$username = trim($username);
$length = vbstrlen($username);
if ($length == 0)
// skipped unrelated if conditionals for clarity /////////////////////////
else if (htmlspecialchars_uni($username_raw) != $this->existing['username'] AND $user = $this->dbobject->query_first("
SELECT userid, username FROM " . TABLE_PREFIX . "user
WHERE userid != " . intval($this->existing['userid']) . "
AND
(
username = '" . $this->dbobject->escape_string(htmlspecialchars_uni($username)) . "'
OR
username = '" . $this->dbobject->escape_string(htmlspecialchars_uni($username_raw)) . "'
)
"))
{
// name is already in use
if ($this->error_handler == ERRTYPE_CP)
{
$this->error('usernametaken_edit_here', htmlspecialchars_uni($username), $this->registry->session->vars['sessionurl'], $user['userid']);
}
else
{
$this->error('usernametaken', htmlspecialchars_uni($username), $this->registry->session->vars['sessionurl']);
}
return false;
}
How can I resolve this?
--------------- Added [DATE]1447388506[/DATE] at [TIME]1447388506[/TIME] ---------------
This problem occurs only if two users have same username, one of them in plain text and another with some special characters.
For example, usernames "User" and "?ser". It won't recognize the second one as unique username.