diff --git a/user_import.admin.inc b/user_import.admin.inc
index a3a2068..bc1d998 100644
--- a/user_import.admin.inc
+++ b/user_import.admin.inc
@@ -624,6 +624,16 @@ function user_import_edit_file_fields(&$form, $import) {
 function _user_import_file_open($filepath, $filename) {
 
   ini_set('auto_detect_line_endings', true);
+
+  // Convert file to UTF-8 if encoding is not UTF-8.
+  $contents = @file_get_contents($filepath);
+
+  if ($contents && (mb_check_encoding($contents, 'UTF-8') === FALSE)) {
+    // Assume we're coming from ISO-8859-1 as utf8_encode() does.
+    $contents = utf8_encode($contents);
+    file_put_contents($filepath, $contents);
+  }
+
   $handle = @fopen($filepath, "r");
 
   if (!$handle) {
@@ -813,6 +823,11 @@ function _user_import_file_row($filename, $handle, $delimiter = ',') {
 		$delimiter = '\t';
 	}
 
+  // Locale must be set for fgetcsv() to correctly match our file encoding.
+  // Otherwise a leading special character in a field results in an empty
+  // string due to PHP bug http://bonsai.php.net/bug.php?id=48507.
+  setlocale(LC_ALL, 'en_US.UTF-8');
+
 	$data_row = @fgetcsv ($handle, 1000000, $delimiter);
 
 	if (!$data_row) {
diff --git a/user_import.import.inc b/user_import.import.inc
index fb147e0..345cfde 100644
--- a/user_import.import.inc
+++ b/user_import.import.inc
@@ -26,6 +26,11 @@ function _user_import_process($settings) {
 	// start count of imports on this cron run
 	$processed_counter = 0;
 
+	// Locale must be set for fgetcsv() to correctly match our file encoding.
+	// Otherwise a leading special character in a field results in an empty
+	// string due to PHP bug http://bonsai.php.net/bug.php?id=48507.
+	setlocale(LC_ALL, 'en_US.UTF-8');
+
   while ($data = fgetcsv($handle, $line_max, $delimiter)) {
 
 		$errors = user_import_errors(FALSE, TRUE);
