Laravel Blade中Select下拉框西班牙语重音字符显示异常排查
问题根源分析与解决方案
你的问题核心出在错误地将Eloquent模型实例当作字符串进行解析,这直接导致了重音字符的编码异常。
错误代码的问题点
当你执行Activity::select('entityAct')->distinct()->orderBy('entityAct')->get();时,返回的$entities是Eloquent集合,其中每个$entity是Activity模型的实例,而非字符串。你直接对模型实例使用explode,PHP会自动将模型转为JSON格式的字符串(类似{"entityAct":"Entidad con acento"}),手动拆分这个字符串的操作完全没必要,而且会破坏UTF-8编码的完整性——尤其是mb_convert_encoding的重复转换,会让原本正常的重音字符出现乱码。
修正后的控制器代码
直接从模型实例中获取entityAct属性即可,无需手动解析字符串:
public function getEntities() { // 用pluck直接获取去重并排序的entityAct列表,简化代码 $entidades = Activity::select('entityAct') ->distinct() ->orderBy('entityAct') ->pluck('entityAct') ->toArray(); return array_unique($entidades); }
简化后的Blade代码
另外,Blade模板中不建议直接调用控制器静态方法,更合理的方式是通过控制器将数据传递到视图,但如果暂时保留现有结构,修正后无需额外编码转换:
@php $entidades = \App\Http\Controllers\ActivityController::getEntities(); @endphp <div class="col-lg-6"> <select name="selectEntity" id="selectEntity"> <option selected value="">Elige una entidad</option> @foreach ($entidades as $entidad) <option value="{{ $entidad }}">{{ $entidad }}</option> @endforeach </select> </div>
额外验证点
- 确认数据库表的
entityAct字段编码为utf8mb4_unicode_ci或utf8mb4_spanish_ci - 检查Laravel配置文件
config/database.php,确保MySQL连接的charset设为utf8mb4,collation设为utf8mb4_unicode_ci
内容的提问来源于stack exchange,提问作者patolucatis
相关产品推荐
相关产品推荐

